2016-09-15 53 views
0

我試圖做的NodeJS和jQuery - 傳遞和保存的二進制文件

上傳來自瀏覽器的二進制文件(在這種情況下的.docx),並將其保存在服務器上。在服務器上使用NodeJs/ExpressJS。

問題

我可以成功地從客戶端向服務器傳送文本文件(以.json/.TXT/.CSV),併成功挽救,但我似乎無法做到這一點的二進制文件。我得到了「沒有從文本到二進制的轉換」錯誤,其中沒有數據的文件損壞或內部錯誤。

客戶端

輸入上傳後,我打電話

fRead.readAsArrayBuffer(fName); 

的$就調用

$.ajax({ 
     url: url, 
     type: 'POST', 
     data: obj, //the obj is the e.target.result from FileReader 
     contentType: 'application/octet-stream', 
     dataType: 'binary', 
     success: function (data) { 
      cbFn(data.msg); 
     }, 
     error: function (xhr, status, error) { 
      alert("error " + status + " " + error); 
     } 
    }); 

服務器端

在服務器側

fs.writeFile(saveFile, req.body, 'binary', (err) => { 
    if (err) throw err; 
    console.log('file saved to ' + saveFile); 
}); 

現在在服務器端,上面的代碼引發錯誤「從文本到二進制沒有轉換」,儘管它保存該文件(損壞,無數據)。如果我將其更改爲

fs.writeFile(saveFile, Buffer.from(req.body), 'binary', (err) => { 
    if (err) throw err; 
    console.log('file saved to ' + saveFile); 
}); 

我剛剛得到一個內部錯誤。

在這一點上,我不知道我的錯誤在哪裏 - 是我在$ .ajax調用中使用了錯誤的編碼類型嗎?或者我在fs.writeFile中的選項是錯誤的,或者我可能根本不應該使用fs.writeFile和其他東西?我覺得有這麼多的排列,所以我可以用一點幫助。

也感到驚訝這是很難找到一個很好的在線文章這種情況下 - 我只是想上傳一個二進制文件並保存!

回答

0

不要把它讀作arrayBuffer用的FileReader,只是發斑的是

var file = new Blob(["321"]) 
$.ajax({ 
    type: 'POST', 
    url: '/upload.php', 
    data: file, 
    processData: false, 
    contentType: false 
}) 
+0

我不知道你是如何創建的文件。一旦我有了fileReader對象,在發送給服務器之前,我需要做些什麼來讀取內容?我嘗試了上面的方法,只需傳遞fileReader.onload = function(e)中的'e',以及e.target和e.target.result即可。不起作用。 nodejs服務器顯示它沒有req.body ... – Gerry

+0

擰上FileReader ...我假設'fName'是blob,所以只需將fName作爲'data' – Endless