从blob创建文件

时间:2017-05-23 08:51:12

标签: javascript safari form-data fileapi

我需要一些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})在某种程度上是失败的。

知道这里有什么问题?

1 个答案:

答案 0 :(得分:6)

这可能是safari年轻实施中的一个错误。

但为什么你甚至将它转换为File对象?

File对象是Blob,唯一的区别是它具有namelastModified属性。但是,由于您似乎已经扩展了blob,因此它只会留下您可以添加的lastModified属性。

我能想到的唯一API,如果您的对象是Blob或文件 FormData.append方法会产生影响;如果您传递File对象,它将能够自动设置文件名。但是这个方法有第三个参数,允许你设置这个文件名。

因此,如果您将代码更改为包含formData.append("attachment", image, image.name);并直接使用handleImage(blob)调用它,它将执行与您正在执行的请求完全相同的请求,但它将在Safari和每个其他不支持File构造函数的浏览器(看着你的IE)。