Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从blob创建文件_Javascript_Safari_Form Data_Fileapi - Fatal编程技术网

Javascript 从blob创建文件

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:

我需要一些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: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");
            }
        });