2017-03-23 108 views
4

首先,請允許我道歉,如果我說什麼都沒有意義。我已經遠離了我的舒適區,不知道自己在做什麼。隨着這說...從XMLHttpRequest對象響應創建文件

我使用Google Drive File Picker library允許用戶從他們的谷歌驅動器上傳他們的簡歷。

function downloadGDriveFile(file) { 
    if (file.downloadUrl) { 
     var accessToken = gapi.auth.getToken().access_token; 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', file.downloadUrl); 
     xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); 
     xhr.onload = function() { 
      var content = xhr.response; 
      console.log(xhr); 

      form_element = document.getElementById("new_guest_application"); 
      form_data = new FormData(form_element); 
      new_file = new File([content], file.title, {type: file.mimeType}); 
      form_data.append('guest_application[curriculum_vitae]', new_file); 
      console.log(new_file); 

      var request = new XMLHttpRequest(); 
      request.open("POST", form_element.action); 
      request.send(form_data); 

     }; 
     xhr.onerror = function() { 
      alert('Download failure.'); 
     }; 
     xhr.send(); 
    } 
    else { 
     alert('Unable to download file.'); 
    } 
} 

使用上面的代碼中,我接受所選擇的對象file和使用它,與相關的頭令牌一起,要下載的文件的content。這似乎按預期工作。

當我嘗試將所述內容變成File以附加到表單並提交給我的服務器時,我的問題就出現了。

上面的代碼工作,只要文件被服務器接受並相應地上傳,但所述文件已損壞。我可以想象這是因爲我在file = new File([content], file.title, {type: file.mimeType});線路上做錯了什麼,但是我遠遠超出了我的舒適區域,我甚至不知道從哪裏開始。

(我沒有做很多JavaScript作爲一種規則,只設法與複製/粘貼試錯健康的劑量遠遠得到這個)

有人能幫助我嗎?謝謝。

+0

丹尼爾之前覆蓋xhr.responseType,你應該告訴你如何處理文件上傳在服務器端也是如此。用一些已知內容的簡單文本文件(如「123456qwerty」)運行測試並查看文件的損壞情況也是有意義的。乍看之下,您的客戶端代碼看起來不錯。 – SergGr

回答

2

xhr.response將返回一些數據,格式取決於在xhr.responseType中定義的數據類型。 如果您攜帶二進制數據,並且responseType設置爲文本類型,則您的數據將被損壞。

你可以嘗試只讀取響應

xhr.responseType = "arraybuffer"; 
var content = xhr.response;