我正在尝试通过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文件,两者的结果相同。
有没有人知道我可以改变什么来使这项工作?
答案 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);
}
});
});