2016-05-17 69 views
0

到目前爲止我有這個代碼,但不能得到Buffer bianary。如何用http模塊上傳node.js中的文件?

var http = require('http'); 
var myServer = http.createServer(function(request, response) 
{ 
    var data = ''; 

    request.on('data', function (chunk){ 
     data += chunk; 
    }); 

    request.on('end',function(){ 

     if(request.headers['content-type'] == 'image/jpg') { 

      var binary = Buffer.concat(data); 

      //some file handling would come here if binary would be OK 

      response.write(binary.size) 
      response.writeHead(201) 
      response.end() 
     } 

但得到這個錯誤:throw new TypeError('Usage: Buffer.concat(list, [length])');

回答

1

你做了三個壞事:

  1. 使用緩衝API錯誤 - 因此錯誤消息。
  2. 串聯二進制數據作爲字符串
  3. 緩衝內存中的數據

穆克什已經處理了#1,所以我將覆蓋更深層的問題。

首先,您正在接收二進制Buffer塊,並使用默認(utf8)編碼將它們轉換爲字符串,然後將它們連接起來。這會破壞你的數據。除了現有的字節序列不是有效的utf8,如果一個有效的序列被一個塊減半,你也會失去這些數據。

相反,您應該始終保持數據爲二進制數據。維護一個Buffer的數組,每個組塊push,然後在最後連接它們。

這導致問題#3。您將整個上傳緩存到內存中,然後將其寫入文件,而不是直接將其上傳到(臨時)文件。這會給應用程序帶來很多負擔,既會佔用內存,也會耗費時間來分配所有內存。你應該只需piperequest到一個文件輸出流,然後檢查它在磁盤上。

如果你只接受非常小的文件,你可以逃脫保持在內存中,但是你需要保護自己的客戶發送太多的數據(實際上說謊他們打算髮送多少)。

+0

優秀回答:) –