2016-05-17 84 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

优秀回答:) –