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

Eri*_* H. 26 ajax rest jquery filereader

我试图通过rest API发布上传到HTML文件输入到网页的附件.API文档指出帖子是直接二进制内容作为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)
})
Run Code Online (Sandbox Code Playgroud)

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

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

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

Esa*_*ija 34

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

$('#_testButton').bind('click', function () {
    var file = document.getElementById('_testFile').files[0];

    $.ajax({
        url: "/attachmentURL",
        type: "POST",
        data: file,
        processData: false
    });
});
Run Code Online (Sandbox Code Playgroud)

这里描述: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类型为其值.

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

  • -1:OP表示,服务器需要直接二进制内容,而不是表单数据中包含的内容. (2认同)