2015-11-24 58 views
0

我试图通过webbrowser(FF 42.0,PhantomJS 1.9.8)和Dropbox v2 api将数据上传到Dropbox。我的功能看起来像这样从浏览器使用Dropbox v2 API

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); 
      } 
     }); 
    } 

即使我设置Content-Type的所有属性,我能想到的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" 

考虑看看萤火虫请求显示我Content-Type确实设置为application/octet-stream; charset=UTF-8。当尝试text/plain; charset=dropbox-cors-hack作为内容类型发送的请求有text/plain; charset=UTF-8,并且我得到相同的错误消息。

如何让jquery和我的浏览器设置我需要的标题。

编辑:在Chrome 相同的行为IE按预期工作

回答

4

从技术上讲,火狐只是秉承W3C XMLHttpRequest的规格:

http://www.w3.org/TR/XMLHttpRequest/#the-send()-method

发送以外的任何其他一个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); 
    } 
}) 
+0

奇妙的答案格雷格+1 我想将链接添加到TextEncoder沉,这可能是有用的因为所有浏览器都不支持TextEncoder:https://github.com/inexorabletash/text-encoding – Kai

0

尝试......

 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 
      ); 
    }