2015-11-24 3 views
0

Я пытаюсь загрузить данные в Dropbox через webbrowser (FF 42.0, PhantomJS 1.9.8) и dropbox v2 api. Моя функция выглядит следующим образомИспользование 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" 

Взглянув на просьбе в Firebug показывает мне что Content-Type действительно установлен на application/octet-stream; charset=UTF-8. При попытке text/plain; charset=dropbox-cors-hack как Content-Type отправленный запрос имеет text/plain; charset=UTF-8, и я получаю то же сообщение об ошибке.

Как я могу сделать jquery и мой браузер, чтобы установить нужные заголовки.

EDIT: То же самое поведение в Chrome IE работает, как ожидалось

ответ

4

Технически, Firefox только придерживаясь W3C XMLHttpRequest спецификации:

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

ничего другого Отправив чем 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); 
    } 
}) 
+0

чудесный ответ Greg +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 
      ); 
    } 
Смежные вопросы