到目前为止,我已经有了这段代码,但无法获取 Buffer
二进制文件。
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()
}
但出现此错误:抛出 new TypeError('Usage: Buffer.concat(list, [length])');
最佳答案
你做了三件坏事:
- 错误地使用了 Buffer API - 因此出现错误消息。
- 将二进制数据连接为字符串
- 在内存中缓冲数据
穆克什已经解决了#1,所以我将讨论更深层次的问题。
首先,您接收二进制 Buffer
block ,并将它们转换为具有默认 (utf8) 编码的字符串,然后将它们连接起来。这会损坏您的数据。除了现有的字节序列不是有效的 utf8 之外,如果有效序列被一大块切成两半,您也会丢失该数据。
相反,您应该始终将数据保留为二进制数据。维护一个 Buffer
数组,将每个 block push
到其中,然后将它们全部连接到最后。
这导致了问题#3。您将整个上传缓冲到内存中,然后将其写入文件,而不是直接将其流式传输到(临时)文件。这会给您的应用程序带来很大的负载,既耗尽内存,又占用分配内存的时间。您应该将请求
通过管道传送到文件输出流,然后在磁盘上检查它。
如果您只接受非常小的文件,您可能会将它们保留在内存中,但您需要保护自己免受客户端发送过多数据的影响(实际上是在他们要发送的数据量上撒谎)。
关于node.js - 如何使用http模块在node.js中上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37272019/