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

时间:2012-07-09 16:43:04

标签: jquery ajax rest 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)
})

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

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

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

2 个答案:

答案 0 :(得分:34)

简单地将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,因为specified会破坏二进制数据:

  

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

     

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

     

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

发送file引用(blob)即可:

  

如果数据是Blob如果对象的type属性不是空的   string让mime类型成为它的值。

     

让请求实体主体成为数据所代表的原始数据。

答案 1 :(得分:1)

var file;

        $('#_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);
                }
            });
        });
相关问题