我正在开发一个简单的chrome扩展,需要将文件上传到用户的dropbox文件夹。 我正在使用如下所述的简单AJAX请求来上传文件,但是它适用于具有.txt, .json, .c, etc
扩展名的文件.txt, .json, .c, etc
即mime type
为text/plain
或类似类型但所有其他类型的文件文件类型如pdfs,图像文件等被破坏并产生空白内容。 在以正确的方式上传文件时我缺少什么。
function startUpload()
{
var folderPath = $(this).closest('tr').attr('path')+'/';
var file = $("#upload_file")[0].files[0];
if (!file){
alert ("No file selected to upload.");
return false;
}
var reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = function (evt) {
uploadFile(folderPath+file.name,evt.target.result,file.size,file.type);
}
}
//function to upload file to folder
function uploadFile(filepath,data,contentLength,contentType){
var url = "https://api-content.dropbox.com/1/files_put/auto"+filepath;
var headers = {
Authorization: 'Bearer ' + getAccessToken(),
contentLength: contentLength,
};
var args = {
url: url,
headers: headers,
crossDomain: true,
crossOrigin: true,
type: 'PUT',
contentType: contentType,
data : data,
dataType: 'json',
success: function(data)
{
getMetadata(filepath.substring(0,filepath.lastIndexOf('/')),createFolderViews);
},
error: function(jqXHR)
{
console.log(jqXHR);
}
};
$.ajax(args);
}
我相信问题是reader.readAsTextFile(file, "UTF-8")
。 如果文件不是文本文件,则会误解内容。 我想你想要reader.readAsBinaryString
或reader.readAsArrayBuffer
。 (我自己没有测试过。)
编辑
在我自己测试之后,我发现readAsArrayBuffer
是你需要的,但你还需要添加processData: false
作为$.ajax
一个选项,以防止jQuery尝试将数据转换为表单提交中的字段。
还要确保使用dataType: 'json'
来正确解析来自服务器的响应。