node.js - 如何使用http模块在node.js中上传文件?

标签 node.js

到目前为止,我已经有了这段代码,但无法获取 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])');

最佳答案

你做了三件坏事:

  1. 错误地使用了 Buffer API - 因此出现错误消息。
  2. 将二进制数据连接为字符串
  3. 在内存中缓冲数据

穆克什已经解决了#1,所以我将讨论更深层次的问题。

首先,您接收二进制 Buffer block ,并将它们转换为具有默认 (utf8) 编码的字符串,然后将它们连接起来。这会损坏您的数据。除了现有的字节序列不是有效的 utf8 之外,如果有效序列被一大块切成两半,您也会丢失该数据。

相反,您应该始终将数据保留为二进制数据。维护一个 Buffer 数组,将每个 block push到其中,然后将它们全部连接到最后。

这导致了问题#3。您将整个上传缓冲到内存中,然后将其写入文件,而不是直接将其流式传输到(临时)文件。这会给您的应用程序带来很大的负载,既耗尽内存,又占用分配内存的时间。您应该将请求通过管道传送到文件输出流,然后在磁盘上检查它。

如果您只接受非常小的文件,您可能会将它们保留在内存中,但您需要保护自己免受客户端发送过多数据的影响(实际上是在他们要发送的数据量上撒谎)。

关于node.js - 如何使用http模块在node.js中上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37272019/

相关文章:

node.js - Socket IO 无法发出

node.js - 如何在 sequelize 连接对象中设置应用程序名称?

javascript - Node - 在继续之前等待 map 完成

json - 将 Json 文件导入 Mongoose

node.js - 服务器仅监听本地主机 : how to fix?

javascript - axios post请求返回401

javascript - 如何向 ES6 javascript 类添加 mixins?

javascript - 带有 MySQL 句柄的 Node.js REST 重新连接

json - 无法获取 JSON 对象的长度

node.js - Nodejs异步函数原型(prototype)链错误