2016-01-18 3 views
0

Мне нужно загрузить файл из браузера на Google Диск. Это мой код загрузки: (files массив файлов получить от <input type="file">)Драйвер REST API - загрузка многофайлового файла jquery

 var boundary = "foo_bar_baz"; 
     const delimiter = "\r\n--" + boundary + "\r\n"; 
     const close_delim = "\r\n--" + boundary + "--"; 

     var contentType = doc.mimeType; 
     var metadata = { 
     "title": doc.name, 
     "mimeType": doc.mimeType 
     }; 

     var reader = new FileReader(); 

     reader.onload = function(e){ 

     var multipartRequestBody = 
      delimiter + 'Content-Type: application/json\r\n\r\n' + 
      JSON.stringify(metadata) + 
      delimiter + 'Content-Type: ' + contentType + '\r\n' + '\r\n' + 
      e.target.result + 
      close_delim; 

     $.ajax({ 
      url: 'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart', 
      type: 'POST', 
      headers: { 
      "Authorization": 'Bearer ' + luminDriveAccessToken, 
      "Content-Type": 'multipart/related; boundary="'+ boundary + '"' 
      }, 
      success: function() { 
      console.log('>>> Done uploading.'); 
      }, 
      error: _handleUploadErrors, 
      data: multipartRequestBody, 
      cache: false, 
      contentType: false, 
      processData: false, 
      crossDomain: true 
     }); 
     }; 

     reader.readAsBinaryString(files[0]); 

Когда я запускаю этот скрипт, файл был загружен на мой Google Drive (правильное название, правильное MIMETYPE), но содержимое файла (Google Диск не может открыть его). Когда я загружаю файл на свой компьютер, я не могу его открыть и Я понимаю, что размер загружаемого файла немного больше исходного(например, файл .docx: 15,4 КБ по сравнению с 11.3 КБ).
Так что, я думаю, проблема связана с содержимым файла перед отправкой его на сервер. Но я еще не знаю, как это исправить. Надеюсь, вы, ребята, могли бы помочь!

+1

Вы пытались отправить с использованием FormData API? – charlietfl

+0

У меня нет (на самом деле я не знаю, как это сделать). Я просто следую API здесь: https://developers.google.com/drive/v2/web/manage-uploads – sonlexqt

ответ

0

Я выясняю решение путем преобразования результата считывания в base64Data, затем добавьте Content-Transfer-Encoding: base64 в тело запроса.

reader.onload = function(e){ 
     var base64Data = btoa(e.target.result); 
     var multipartRequestBody = 
      delimiter + 'Content-Type: application/json\r\n\r\n' + 
      JSON.stringify(metadata) + 
      delimiter + 'Content-Type: ' + contentType + '\r\n' + 
      'Content-Transfer-Encoding: base64\r\n' + '\r\n' + 
      base64Data + close_delim; 

     $.ajax({ 
      url: 'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart', 
      type: 'POST', 
      headers: { 
      "Authorization": 'Bearer ' + ACCESS_TOKEN, 
      "Content-Type": 'multipart/related; boundary="'+ boundary + '"' 
      }, 
      success: function() { 
      // TODO XIN 
      console.log('>>> DONE'); 
      }, 
      error: _handleUploadErrors, 
      data: multipartRequestBody, 
      cache: false, 
      contentType: false, 
      processData: false, 
      crossDomain: true 
     }); 
     }; 
Смежные вопросы