gpt4 book ai didi

javascript - Safari 在插入 FormData 时将 File 转换为 [object Object]。怎么修?

转载 作者:搜寻专家 更新时间:2023-11-01 04:33:22 25 4
gpt4 key购买 nike

我正在使用新的 FormData 界面在 Javascript 中发布一个文件。当我使用 Safari 5.1.5 使用“multipart/form-data”发送文件时,Safari 将文件强制转换为字符串,而不是发送实际文件内容,而是发送 [object Object]

例子:

var formdata = new FormData();
formdata.append("file", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://example.com/upload", true);
xhr.send(formdata);

Safari 最终发送的内容:

Origin: https://example.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycLc5AIMWzGxu58n8
Referer: https://example.com/upload

------WebKitFormBoundarycLc5AIMWzGxu58n8
Content-Disposition: form-data; name="file"

[object Object]

因此,我的文件已上传,但文件的内容,您猜对了,[object Object]

这到底是怎么回事?这是 Safari 的错误吗?

编辑 1

对于那些好奇如何动态生成 JS Blob 的人,这里有一个例子:

var Builder = (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder);
var builder = new Builder();
builder.append("hello, world");
var file = builder.getBlob("text/plain")

不幸的是,这在 Safari 上起作用,所以将它包含在问题中并没有真正帮助。

编辑2

我引用的文件对象来自 DOM 元素上的放置操作。下面是如何检索文件的示例。在加载 DOM 后运行以下命令。

function cancel(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
if (e.preventDefault) {
e.preventDefault();
}
}

function drop(e) {
cancel(e);
for (var i=0; i<e.dataTransfer.files.length; i++) {
file = e.dataTransfer.files[i];
}
}

var elem = document.getElementById("upload-area");
elem.addEventListener("drop", drop, false);

最佳答案

当我问这个问题时,这似乎无关紧要,但我想通了。在使用 XMLHttopRequest 上传文件之前,我调用了 jQuery 的 $.ajax 方法来调用后端中的端点来准备文件。

简而言之:这是 Safari 上 jQuery 的一个错误。我正在使用 for 循环来处理文件列表,然后上传它们。我将一个文件对象作为参数传递给 jQuery $.ajax 方法,这样我想要的文件对象就不会在执行多个循环时被重写。例如

for (i in files) {
var file = files[i];
$.ajax({
method: "POST",
myFile: file,
success: function(response) {
var file = this.myFile;
// ...
});
}

事实证明,jQuery 碰巧在 Safari 中错误地克隆了 file 对象。因此,当设置为 this.myFile 时,它不会将其转换为文件,而是将其转换为对象,从而使其失去所有特殊的“类文件”功能。尽管如此,其他浏览器似乎明白该对象仍然是一个文件。

答案是写一个回调方法来处理文件上传。

function handleFile(file) {
$.ajax({
method: "POST",
success: function(response) {
// ...
});
}

for (var i in files) {
handleFile(files[i]);
}

附言打算将其提交给 jQuery 错误跟踪器,但只是想将其保留在这里以防其他人遇到同样的问题。

关于javascript - Safari 在插入 FormData 时将 File 转换为 [object Object]。怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9951531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com