通过AJAX Post将文件输入发布为FileReader二进制数据

我试图通过rest API发布上传到HTML文件输入到网页的附件。 API文档指出post是直接二进制内容作为HTTP请求的主体,而不是表单文件上载。

我的代码如下:

$('#_testButton').bind('click', function () { var file = document.getElementById('_testFile').files[0] var reader = new FileReader(); reader.onload = function () { $.ajax({ url: '/attachmentURL', type: 'POST', data: reader.result }) } reader.readAsBinaryString(file) }) 

我需要这个来处理许多不同的mimeTypes,所以我没有在上面的代码中声明它。 但是,我尝试为.doc文件声明contentType:’application / msword’,并尝试使用processData:false和contentType:false。

数据将被发布到应该的位置。 但是,当我打开文件时,我收到一条消息,上面写着mimeType:带有空文件的application / x-empty或带有一堆二进制字符的文件。 我已经尝试过.doc文件和pdf文件,两者的结果是一样的。

有没有人知道我可以改变什么使这项工作?

简单地将file引用作为数据发送(使用processData: false )至少为我完成了这项工作:

 $('#_testButton').bind('click', function () { var file = document.getElementById('_testFile').files[0]; $.ajax({ url: "/attachmentURL", type: "POST", data: file, processData: false }); }); 

它在这里描述: https : //developer.mozilla.org/en/DOM/XMLHttpRequest/Sending_and_Receiving_Binary_Data#section_3

发送字符串(即使该字符串表示二进制数据)也不起作用,因为浏览器会强制将其转换为unicode并按指定编码为utf-8,这会破坏二进制数据:

如果数据是字符串,则编码为UTF-8。

让mime类型为“text / plain; charset = UTF-8”。

让请求实体主体转换为Unicode并编码为UTF-8。

发送file引用( blob )将执行此操作:

如果数据是Blob如果对象的type属性不是空字符串,则让mime类型为其值。

让请求实体主体是数据表示的原始数据。

var文件;

  $('#_testFile').on("change", function (e) { file = e.target.files[0]; }); $('#_testButton').click(function () { var serverUrl = '/attachmentURL'; $.ajax({ type: "POST", beforeSend: function (request) { request.setRequestHeader("Content-Type", file.type); }, url: serverUrl, data: file, processData: false, contentType: false, success: function (data) { console.log("File available at: ", data); }, error: function (data) { var obj = jQuery.parseJSON(data); alert(obj.error); } }); });