Javascript 从blob创建文件
我需要一些javascript专家。我有以下代码:Javascript 从blob创建文件,javascript,safari,form-data,fileapi,Javascript,Safari,Form Data,Fileapi,我需要一些javascript专家。我有以下代码: handleImage(new File([blob], blob.name, {type: blob.type})).done(/* something */) 及 这在Chrome和Firefox上运行良好,但在使用Safari(10.1.1)时,服务器(java/spring mvc)会在multipartttpServletRequest中收到一个空文件作为“附件”。所以在我看来,新文件([blob],blob.name,{type:
handleImage(new File([blob], blob.name, {type: blob.type})).done(/* something */)
及
这在Chrome和Firefox上运行良好,但在使用Safari(10.1.1)时,服务器(java/spring mvc)会在multipartttpServletRequest
中收到一个空文件作为“附件”。所以在我看来,新文件([blob],blob.name,{type:blob.type})
不知何故失败了
知道这里出了什么问题吗?这可能是safari年轻的实现中的一个bug 但为什么要将其转换为文件对象呢? 文件对象是一个Blob,唯一的区别是它有一个
名称
和一个lastModified
属性。但是,由于您似乎已经扩展了blob
,因此只剩下这个lastModified
属性,您也可以添加它
我能想到的唯一一个API,如果你的对象是一个Blob或一个文件,那么它就不同了,它就是FormData.append
方法;如果您传递一个文件对象,它将能够自动设置文件名。但是这个方法有第三个参数,允许您设置这个文件名
因此,如果您将代码更改为包含
formData.append(“附件”,image,image.name)直接用handleImage(blob)
调用它,它将执行与您正在执行的请求完全相同的请求,只是它将在Safari和其他不支持文件构造函数的浏览器上工作(查看IE)。可能是Safari的实现,但您为什么还要将其转换为文件对象呢?唯一的区别是对象上有一个lastModified
属性。。。将Blob附加到FormData时,第三个参数设置附件的名称。所以formData.append(“附件”,image,image.name)
和handleImage(blob)
将执行与您正在执行的请求完全相同的请求,除了它将在Safari a、d上工作,每隔一个不支持文件构造函数的浏览器(看着您IE)@Kaido我有另一个调用handleImage
的请求,该请求是使用文件参数执行的,但再次,文件是Blob的子集。唯一的区别是该文件将添加一个名称
和一个lastModified
属性。似乎您已经用自己的名称
道具扩展了blob
,所以现在唯一的区别是这个上次修改的
道具,您也可以添加自己。我没有看到一个API需要文件覆盖Blob。文件的唯一优点是不需要设置FormData.append
的第三个参数。因此,您可以对文件执行与对Blob执行的操作完全相同的操作。(file instanceof Blob;
为真)@kaido谢谢,直接使用Blob确实解决了这个问题。你能发表你的评论作为回答吗?是的,我会尽快在火车上坐下来,或者在几个小时后
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");
}
});