26

我正在尝试通过 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)
})

我需要它适用于许多不同的 mimeType,所以我没有在上面的代码中声明它。但是,我尝试为 .doc 文件声明 contentType:'application/msword',还尝试了 processData:false 和 contentType:false。

数据被发布在它应该发布的地方。但是,当我打开文件时,我收到一条消息,显示 mimeType:application/x-empty 带有一个空文件或一个带有一堆二进制字符的文件。我试过 .doc 文件和 pdf 文件,结果是一样的。

有谁知道我可以改变什么来完成这项工作?

4

2 回答 2

36

只需将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 如果对象的类型属性不是空字符串,则让 mime 类型为其值。

让请求实体body为data表示的原始数据。

于 2012-07-09T16:54:09.323 回答
1

变量文件;

        $('#_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);
                }
            });
        });
于 2015-08-05T11:28:38.557 回答