【发布时间】:2017-05-23 08:51:11
【问题描述】:
我需要一些 javascript 大师。我有这个代码:
handleImage(new File([blob], blob.name, {type: blob.type})).done(/* something */)
和
handleImage = function (image) {
// create some fake form data
var formData = new FormData();
formData.append("attachment", image);
formData.append("auto", true);
formData.append("_csrf", "xxxxxxxxx");
// post to the server.
return $.ajax({
url: "/some/url",
data: formData,
cache: false,
contentType: false,
processData: false,
type: 'POST',
error: function () {
console.log("error");
}
});
这适用于 Chrome 和 Firefox,但在使用 Safari (10.1.1) 时,服务器 (java / spring mvc) 在 MultipartHttpServletRequest 中接收到一个用于“附件”的空文件。所以在我看来new File([blob], blob.name, {type: blob.type}) 在某种程度上失败了。
知道这里出了什么问题吗?
【问题讨论】:
-
可能是 safari 的实现,但你为什么还要将它转换为 File 对象?您将获得的唯一区别是您将在对象上拥有一个
lastModified属性...当您将 Blob 附加到 FormData 时,第三个参数设置附件的名称。所以formData.append("attachment", image, image.name);和handleImage(blob)将执行与您正在执行的请求完全相同的请求,除了它将在 Safari 和其他不支持 File 构造函数的所有其他浏览器上运行(看着你的 IE) -
@Kaiido 我对
handleImage进行了另一个调用,使用文件参数 -
不过,File 还是 Blob 的一个子集。唯一的区别是 File 将添加一个
name和一个lastModified属性。看来您已经用自己的name属性扩展了您的blob,所以现在唯一的区别是这个lastModified属性,您也可以自己添加它。我没有看到需要文件而不是 Blob 的 一个 API。文件的唯一优点是您不需要设置FormData.append的第三个参数。因此,您可以对文件执行与对 Blob 执行的操作完全相同的操作。 (file instanceof Blob;是真的) -
@Kaiido 谢谢,直接使用 blob 确实解决了这个问题。您可以发表您的评论作为答案吗?
-
是的,只要我能坐到火车上,或者几个小时后,我就会去
标签: javascript safari form-data fileapi