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

时间:2012-07-12 09:14:44

标签: jquery ajax upload binaryfiles put

我是JQuery的新手 我想使用JQuery Ajax将一些文件上传到服务器,仅在PUT方法中。 当我向我的服务器发送一些二进制文件(例如gif或jpeg)时,上传成功,但二进制数据的内容被更改(它总是大于原始文件大小)。 我尝试更改内容类型或文件结果的类型,但仍然无法正常工作。 谁知道如何解决这个问题?

PS:我无法将二进制文件的内容编码成其他形式,因为我无法触及服务器的代码。

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);

1 个答案:

答案 0 :(得分:3)

大多数(全部?)浏览器在通过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代码。