从浏览器使用Dropbox v2 API
Using Dropbox v2 API from Browser
我正试图通过网络浏览器(FF 42.0,PhantomJS 1.9.8)和dropbox v2 api将数据上传到dropbox。我的功能看起来像这个
function(path, data, callback) {
$.ajax({
url: 'https://content.dropboxapi.com/2/files/upload',
type: 'post',
contentType: 'application/octet-stream',
beforeSend: function(jqXHR) {
jqXHR.setRequestHeader("Content-Type","application/octet-stream");
},
data: data,
headers: {
"Authorization": "Bearer " + token,
"Dropbox-API-Arg": '{"path": "' + path + ',"mode": "add","autorename": true,"mute": false}',
"Content-Type": "application/octet-stream"
},
success: function (data) {
callback(data);
}
});
}
即使我将我能想到的所有属性的内容类型都设置为application/octet-stream
,我也会得到以下错误
Error in call to API function "files/upload": Bad HTTP "Content-Type" header: "application/octet-stream
; charset=UTF-8". Expecting one of "application/octet-stream", "text/plain; charset=dropbox-cors-hack"
查看Firebug中的请求,可以发现ContentType实际上设置为application/octet-stream; charset=UTF-8
。当尝试将text/plain; charset=dropbox-cors-hack
作为内容类型时,发送的请求具有text/plain; charset=UTF-8
,并且我得到相同的错误消息。
我如何让jquery和我的浏览器设置我需要的标题。
EDIT:Chrome中的相同行为IE按预期工作
从技术上讲,Firefox只是遵循W3C XMLHttpRequest规范:
http://www.w3.org/TR/XMLHttpRequest/#the-send()-方法
发送Blob
或ArrayBufferView
以外的任何内容都可能导致浏览器尝试用UTF-8编码数据(遵循规范)时出现问题。
正确的做法是避免将数据作为字符串发送。以下是如何避免这种行为的两个例子:
// ... file selected from a file <input>
file = event.target.files[0];
$.ajax({
url: 'https://content.dropboxapi.com/2/files/upload',
type: 'post',
data: file,
processData: false,
contentType: 'application/octet-stream',
headers: {
"Authorization": "Bearer " + ACCESS_TOKEN,
"Dropbox-API-Arg": '{"path": "/test_ff_upload.txt","mode": "add","autorename": true,"mute": false}'
},
success: function (data) {
console.log(data);
}
})
或者,如果你想发送文本,你可以在上传之前对文本进行UTF-8编码。一种现代的方法是使用TextEncoder:
var data = new TextEncoder("utf-8").encode("Test");
$.ajax({
url: 'https://content.dropboxapi.com/2/files/upload',
type: 'post',
data: data,
processData: false,
contentType: 'application/octet-stream',
headers: {
"Authorization": "Bearer " + ACCESS_TOKEN,
"Dropbox-API-Arg": '{"path": "/test_ff_upload.txt","mode": "add","autorename": true,"mute": false}'
},
success: function (data) {
console.log(data);
}
})
试试这个。。。
private void upload(object sender, EventArgs e)
{
OAuthUtility.PutAsync
(
"https://content.dropboxapi.com/1/files_put/auto/",
new HttpParameterCollection
{
{"access_token",Properties.Settings.Default.AccessToken},
{ "path", Path.Combine(this.CurrentPath, Path.GetFileName(openFileDialog1.FileName)).Replace("''", "/") },
{ "overwrite","false"},
{ "autorename","false"},
{openFileDialog1.OpenFile()}
},
callback : Upload_Result
);
}
相关文章:
- Possibile使用Manifest v2下的HTML5地理位置API将lat/long转换为国家/地区
- SoundCloud api-v2是否被弃用
- Phonegap插件谷歌地图api v2上的多个标记
- 从Google Maps JavaScript API V2迁移到V3,编码多边形
- 确定天气用户是否喜欢照片.Facebook图形API v2.2
- 谷歌将api v2映射到v3
- 如何在谷歌图像搜索api v2中获取图像url
- 谷歌地图 JS API v3 - 简单的多重标记 v2
- 将 v2 更新到 v3 谷歌地图 API 未加载
- Facebook Api V2.2 Fql query
- flattr REST API v2 教程和示例
- 在谷歌地图Javascript API v2(用于营业执照)中,如何正确调用地图API
- 基本的REST调用WordPress V2 API与Angular.js
- 谷歌地图 API v2
- 更改谷歌地图 API v2 的颜色
- 如何使用谷歌地图 API V2 计算总距离
- 创建了10多个谷歌地图api密钥(V2)
- 使用API v2将自定义标记添加到Google地图
- 将Google Maps API V2升级到V3
- 从浏览器使用Dropbox v2 API