Javascript Mac上的Safari 10未在XHR中上载文件

Javascript Mac上的Safari 10未在XHR中上载文件,javascript,safari,xmlhttprequest,Javascript,Safari,Xmlhttprequest,我使用XHR将图像上传到启用CORS的外部服务器 在Chrome、Firefox和IE中一切都很好 但使用Safari时,服务器响应会出现mime类型错误。表示文件类型为“application/octet stream”,而文件类型应为“image/*” 在我禁用mime类型检查后,safari可以上载文件,但它的所有0b文件都是空的 有人知道为什么吗 var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://up-z1.

我使用XHR将图像上传到启用CORS的外部服务器

在Chrome、Firefox和IE中一切都很好

但使用Safari时,服务器响应会出现mime类型错误。表示文件类型为“application/octet stream”,而文件类型应为“image/*”

在我禁用mime类型检查后,safari可以上载文件,但它的所有0b文件都是空的

有人知道为什么吗

    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://up-z1.qiniu.com/', true);
    var formData;
    formData = new FormData();
    formData.append('key', file.name);
    formData.append('token', acessToken);
    formData.append('file', file);
    xhr.onreadystatechange = function (response) {
        if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText != "") {
            callback(true,null);
        } else if (xhr.status != 200 && xhr.responseText) {
            callback(false,null);
        }
    };
    xhr.send(formData);

所以根据另一个问题,我不记得是哪一个 Safari有一个bug,当其他浏览器执行file.toBlob()时,Safari将执行file.toString()。因此,解决方法是将您自己的文件写入blob函数并上传该blob

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://up-z1.qiniu.com/', true);
var formData;
formData = new FormData();
formData.append('key', file.name);
formData.append('token', acessToken);
formData.append('file', fileToBlob(file));
xhr.onreadystatechange = function (response) {
    if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText != "") {
        callback(true,null);
    } else if (xhr.status != 200 && xhr.responseText) {
        callback(false,null);
    }
};
xhr.send(formData);

这是一个非常奇怪的问题。我得出了与+arslan2012相同的结论

对于那些被困在他所指的
fileToBlob
函数上的人来说,以下是我正在使用的

const readFileContents=函数(文件){
返回新承诺((解决、拒绝)=>{
const reader=new FileReader();
reader.onloadend=函数(evt){
解析(evt.target.result)
};
reader.onerror=函数(){
reader.abort()
拒绝(新的DomeException(“无法读取文件”))
}
reader.readAsArrayBuffer(文件);
})

}
此问题的最佳答案@你怎么知道的?