2015-03-12 4 views
0

Я использую Dropbox Core API для загрузки и скачивания файлов через расширение chrome. Когда я загружаю текстовые файлы, например, с расширениями .txt, .js, .json или .c, файлы загружаются успешно, но когда я загружаю файлы с расширениями .pdf, .jpg и т. Д. (Медиафайлы), тогда содержимое обезображается или отсутствует, хотя размер файла не равен нулю, иногда даже больше, чем исходный файл. Это явно означает, что данные, которые читаются, также записываются, но я предполагаю, что есть некоторые проблемы с тем, как я читаю или записываю данные. Код приведен ниже для справки.Несогласованное содержимое файла при загрузке через Dropbox API

$(document).on("click", "#id_submit",uploadProcess); 

function uploadProcess() 
{ 
    var file = $("#upload_file")[0].files[0]; 
    console.log(file); 

    if (!file){ 
     alert ("No file selected to upload."); 
     return false; 
    } 

    var reader = new FileReader(); 
    //reader.readAsText(file, "UTF-8"); 
    reader.readAsBinaryString(file); 
    reader.onload = function (evt) { 
     uploadFile(file.name, evt.target.result, file.size, file.type); 
     //console.log(evt.target.result); 
     var control = $("#upload_file"); 
     control.replaceWith(control = control.clone(true)); 
    } 
} 


//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) 
     { 
      console.log(data); 
     }, 
     error: function(jqXHR) 
     { 
      console.log(jqXHR); 
     } 
    }; 
    $.ajax(args); 
} 
+0

Вы всегда положить CONTENTTYPE как «текст/обычный», который работает отлично для текстовых файлов, которые вы упомянули, но не для других, замените его на вашу переменную contentType, которую вы отправляете на функцию – juvian

+0

@juvian Извините, что я отправил старый код здесь, я уже исправил это, теперь я передаю тип содержимого после чтения 'file.type'. Тем не менее проблема сохраняется. – bawejakunal

+0

Вместо этого попробуйте использовать readAsArrayBuffer. Если он по-прежнему не работает, попробуйте добавить заголовок Accept для текста/plain; charset = iso-8859-1 и размещение типа контента в виде текста/plain; charset = iso-8859-1 – juvian

ответ

0

Фактически вы можете передать файл в свой запрос ajax (в зависимости от поддержки браузера). Просто передайте файлы в ваших аргументах объект, также необходимо установить processDate и CONTENTTYPE ложь, чтобы предотвратить $ .ajax манипулировать объект файла

var args = { 
    ... 
    contentType: false, 
    data : file, 
    processData: false, 
    ... 
}; 
+0

Я знаю, что мы можем передать файл в ajax-запросе, но это не соответствует спецификациям Dropbox Api. – bawejakunal

+0

@bawejakunal Я не вижу никакой несогласованности. Вы попробовали? – Musa

Смежные вопросы