从浏览器使用Dropbox v2 API

Using Dropbox v2 API from Browser

本文关键字:v2 API Dropbox 浏览器      更新时间:2023-09-26

我正试图通过网络浏览器(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()-方法

发送BlobArrayBufferView以外的任何内容都可能导致浏览器尝试用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
             );
     }