2016-07-06 224 views
3

我想上傳一個二進制文件(PDF是具體的)無效文件,這個JS-段:文件上傳:在服務器上

function uploadFile() { 
    var reader = new FileReader(); 
    var file = document.getElementById('uploadInput').files[0]; 
    console.log(file.size); 
    var xhr = new XMLHttpRequest(); 

    xhr.open('POST', 'custom?id=upload'); 
    xhr.setRequestHeader("Content-Type", "application/pdf"); 
    xhr.overrideMimeType('application/pdf'); 
    reader.onload = function(evt) { 
     xhr.send(evt.target.result); 
    }; 
    reader.readAsBinaryString(file); 
} 

在服務器端(Java)的我接收請求並將文件寫入磁盤。
但是,當我打開PDF時,我得到了〜4MB的空間,而我只有空白頁。

傳入請求的頭部還指定了一個〜4MB的內容長度,所以我相當肯定,它是在客戶端上的東西,這是造成麻煩。
發送純文本文件完全沒有問題,它們完全按照它們應有的方式到達。

由於編寫JavaScript和在網絡上工作不在我的日常工作領域,所以很可能我做了一些基本上是錯誤的。

回答

2

我會懷疑兩件事情,你可以嘗試一下:

  • 檢查的MIME類型對過程的兩端,如果它得到某種方式錯位,你有你的答案
  • 您上傳的內容被包裹成一個XMLHttpRequest - 您可能必須手動Base64編碼/解碼以擺脫PDF中的本地字節表示形式

希望這會對您有所幫助,祝您好運!

0

我找到了解決方案:在發送它們之前用Base64顯式編碼數據,並在接收端正確解碼它們。

function uploadFile() { 
    var reader = new FileReader(); 
    var file = document.getElementById('uploadInput').files[0]; 
    console.log(file.size); 
    var xhr = new XMLHttpRequest(); 

    xhr.open('POST', 'custom?id=upload'); 
    xhr.setRequestHeader("Content-Type", "text/plain; charset=x-user-defined"); 
    xhr.overrideMimeType('text/plain; charset=x-user-defined'); 
    reader.onload = function(evt) { 
     var encoded = window.btoa(evt.target.result); 
     xhr.send(encoded); 
    }; 
    reader.readAsBinaryString(file); 
} 

我寫這讓任何人,誰得到了同樣的問題,知道我的解決方案。