Nodejs Express可以不自动把文件上传到临时目录中吗

Nodejs Express可以不自动把文件上传到临时目录中吗

使用express上传文件时,express总是会自动把文件上传到临时目录中,如果没选择文件就会自动生成一个空文件。 有没有办法控制不要自动上传到临时目录中呢

4 回复

当然可以!在使用 Node.js 和 Express 进行文件上传时,默认情况下文件会被暂存到一个临时目录中。不过,你可以通过配置中间件(如 multer)来改变这一行为。以下是一个简单的示例,展示了如何配置 multer 来避免将文件自动上传到临时目录。

示例代码

首先,确保你已经安装了 multer

npm install multer

然后,在你的 Express 应用中进行如下配置:

const express = require('express');
const multer = require('multer');

const app = express();

// 配置 multer
const storage = multer.memoryStorage(); // 将文件存储在内存中
const upload = multer({ storage: storage });

app.post('/upload', upload.single('file'), (req, res) => {
    if (!req.file) {
        return res.status(400).send('No file uploaded.');
    }

    const file = req.file;
    console.log(`File received: ${file.originalname}`);
    console.log(`File size: ${file.size} bytes`);
    console.log(`File type: ${file.mimetype}`);

    // 在这里处理文件,例如保存到数据库或云存储服务
    // 由于文件存储在内存中,无需担心临时目录问题

    res.send('File uploaded successfully!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. multer.memoryStorage():

    • 使用 multer.memoryStorage() 方法将文件直接存储在内存中,而不是临时目录。这样就避免了将文件写入磁盘。
  2. upload.single(‘file’):

    • upload.single('file') 是一个中间件,用于处理单个文件上传。'file' 是表单字段的名称。
  3. req.file:

    • 文件被存储在 req.file 中,你可以直接访问文件的内容、大小、类型等信息。由于文件在内存中,你不需要担心磁盘上的临时文件。

通过这种方式,你可以灵活地控制文件的存储方式,并且不需要处理临时目录中的文件。这在某些场景下非常有用,例如,当文件大小较小或者你需要将文件立即传递给其他服务时。


ref: http://expressjs.com/api.html (找到 req.files)

app.use(express.bodyParser({ keepExtensions: true, uploadDir: ‘/my/files’ }));

uploadDir 可以指定上傳的位置

这个我知道啊, 但是这样设置的后果是任何一个表单提交都会把文件上传到这个临时目录,可是我希望能在上传到临时目录前控制是否需要

在使用Express处理文件上传时,默认情况下文件会被上传到一个临时目录中。这是因为大多数文件上传中间件(如multer)默认将文件存储在临时目录中,然后再将其移动到目标位置。

如果你希望避免文件被自动上传到临时目录中,可以通过自定义文件存储逻辑来实现。这里以multer为例进行说明:

示例代码

首先,确保你已经安装了multer库:

npm install multer

然后,你可以创建一个自定义的存储引擎来避免使用临时目录:

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();

// 创建自定义存储引擎
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 指定文件保存的目标目录
    cb(null, 'uploads/');
  },
  filename: function (req, file, cb) {
    // 自定义文件名,例如使用时间戳加上原始文件扩展名
    cb(null, Date.now() + path.extname(file.originalname));
  }
});

// 初始化Multer实例,并指定存储引擎
const upload = multer({ storage: storage });

app.post('/upload', upload.single('file'), (req, res) => {
  // 文件将直接保存到指定目录
  res.send('File uploaded successfully.');
});

app.listen(3000, () => console.log('Server running on port 3000'));

解释

  1. 自定义存储引擎:通过multer.diskStorage创建一个自定义存储引擎,其中destination函数指定了文件保存的目标目录,filename函数定义了文件名。

  2. 初始化Multer实例:使用自定义存储引擎初始化multer实例。

  3. 路由处理:在/upload路由中使用upload.single('file')中间件处理单个文件上传。文件将直接保存到指定目录uploads/,而不是临时目录。

这样,你就可以控制文件上传的存储路径,而不需要依赖于默认的临时目录。

回到顶部