📜  nodejs读取请求中发送的文件而不保存到文件系统 - Javascript(1)

📅  最后修改于: 2023-12-03 15:33:11.623000             🧑  作者: Mango

Node.js读取请求中发送的文件而不保存到文件系统

在Node.js的web应用中,我们经常需要处理上传文件的请求。但是,我们并不想每次上传文件时都将文件保存到文件系统中,而是直接在内存中处理这些文件。这篇文章将介绍如何使用Node.js读取请求中发送的文件而不保存到文件系统。

在之前的版本中,我们通常会使用multer这个node.js文件上传的中间件,它可以将上传的文件保存到文件系统中。

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  res.json({ file: req.file });
});

然而,这种方式会在服务器文件系统上创建一个包含上传文件的临时目录。在生产中,这可能会导致服务器上临时文件的积累,而且每次上传时还需要在文件系统上进行磁盘I / O操作。

相对于上述做法,我们可以使用Node.js内置的文件系统模块,通过流式传输将文件数据读取到内存中,而不必将其保存到磁盘上。我们需要使用一个叫做busboy的第三方模块来解析multipart / form-data请求,然后使用Node.js自己的文件系统API将文件读入内存。

const http = require('http');
const Busboy = require('busboy');

http.createServer((req, res) => {
  if (req.method === 'POST' && req.url === '/upload') {
    const busboy = new Busboy({ headers: req.headers });
    busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
      const chunks = [];
      file.on('data', chunk => {
        chunks.push(chunk);
      });
      file.on('end', () => {
        const buffer = Buffer.concat(chunks);
        console.log('File saved in memory as buffer:', buffer);
        res.end('File saved in memory');
      });
    });
    req.pipe(busboy);
  }
}).listen(8080, () => console.log('Server started on port 8080'));

在上面的代码中,我们使用了Node.js自带的http模块创建了一个HTTP服务器。当客户端发布POST请求到/uploadURL时,服务器会使用busboy模块解析这个请求并获取到上传的文件。对于上传的每个文件,我们使用Node.js文件系统API将其读取到内存中。在读取完文件之后,我们通过Buffer.concat()方法将其合并到一个大缓冲区中,然后打印这个缓冲区内容。

注意:上述方式适用于上传的文件非常小的情况。对于大文件,可能无法将其全部加载到内存中,因此需要进行一些优化。

总结:这篇文章介绍了如何使用Node.js读取请求中发送的文件而不保存到文件系统中,并通过代码片段演示如何使用busboy模块解析multipart/form-data请求,将上传的文件读取到内存中。这篇文章只是一个实例,仅作为一个参考,你可以根据自己的需求进行定制化开发。