如何通过JQuery Ajax PUT方法发送二进制数据

8
我刚接触JQuery并希望使用JQuery Ajax上传文件到服务器,仅使用PUT方法。当我将一些二进制文件(如gif或jpeg)发送到服务器时,上传成功,但是二进制数据的内容已更改(它始终比原始文件大小大)。我尝试更改内容类型或文件类型的结果,但仍然无法解决问题。有人知道如何修复这个问题吗?注意:我不能将二进制文件的内容编码为其他形式,因为我不能接触服务器端的代码。
var reader = new FileReader();

reader.onloadend = (function(Thefile) {

    $.ajax({
        url: url,
        processData:false,
        //contentType:"application/octet-stream; charset=UTF-8",
        data: file.result,
        type: 'PUT',
        success : function(){console.log("OK!");},
        error : function(){console.log("Not OK!");}
    }); 
})(file);

reader.readAsBinaryString(file);

我遇到了类似的问题。我的第一个猜测是这与ajax函数在发送请求之前处理数据的方式有关。 - Brendan Berg
不管使用jQuery AJAX机制,注意你应该将一个函数分配给reader.onloadend - 而不是自己调用该函数! - Tom
1个回答

5

大多数(或全部?)浏览器在通过XMLHttpRequest发送字符串数据类型时,会自动将它们转换为UTF-8编码。当您将文件读取为二进制字符串时,实际得到的是一个JavaScript字符串对象,其中每个字符的值介于0和255之间。

如果要强制AJAX请求发送二进制编码数据,则数据参数必须是ArrayBufferFileBlob对象。

如果您需要在发送之前访问文件内容,可以使用以下代码将二进制字符串转换为ArrayBuffer

var arrBuff = new ArrayBuffer(file.result.length);
var writer = new Uint8Array(arrBuff);
for (var i = 0, len = file.result.length; i < len; i++) {
    writer[i] = file.result.charCodeAt(i);
}

如果你想将arrBuff实例传给AJAX函数,否则,你应该能够直接将File对象传入AJAX函数中,而不需要所有的FileReader代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接