节点 fs(文件流)在上传单个文件时创建 2 个文件

node fs (filestream) creating 2 files when uploading single file

我正在使用以下代码允许人们将图像上传到服务器:

app.post("/api/upload", function (req, res) {

  fs.readFile(req.files[0].path, function (err, data) {
    console.log('The data for the file..', data);

    if (err) {
      res.send(err).end();
    } else {
      // ...
      var newPath = __dirname + "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname;
      fs.writeFile(newPath, data, function (err) {
        console.log('File Written');
        if (err) {
          res.send(err).end();
        } else {  
          res.send({
            success: true,
            file: newPath,
            files: req.files
          }).end();
        }
        //res.end({"success": true})
      });
    }
  });


});

问题是对于上传的每个文件,我也得到了一个 arrayBuffer 版本(我认为)参见图片:

我该如何防止这种情况,最重要的是,为什么会发生这种情况? 谢谢!

当您使用像 multer 这样的模块时,文件上传通常(永久)保存到磁盘(除非您在 multer 的情况下更改底层后备存储)。因此,当您读取文件并将其写回时,您就有了一份副本。

如果您需要复制文件,这不是最有效的解决方案,因为您要将整个内容读入内存。在更高效的复制机制到位之前,您最好进行流式复制(使用 fs.createReadStream()fs.createWriteStream())以最小化内存中的数据量。

如果您想要 移动/重命名 multer 保存到磁盘的文件,那么您可以配置multer 以便您动态提供目标文件名(有这样的钩子可用), 之后您可以使用 fs.rename() 移动或重命名文件。

有时我得到了一个使用 multer 的解决方案 module.Using 这个模块你可以上传两个文件并且 images.And 它成功上传到目标文件夹。

这是我的服务器代码app.js

var express =r equire('express');
var multer = require('multer');
var path = require('path')
var app = express();
var ejs = require('ejs')
app.set('view engine', 'ejs')
var storage = multer.diskStorage({
    destination: function(req, file, callback) {
        callback(null, './public/uploads')//here you can place your destination path
    },
    filename: function(req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
    }
})

app.get('/api/file',function(req,res){
res.render('index');
});
app.post('/api/file', function(req, res) {
    var upload = multer({
        storage: storage}).single('userFile');
    upload(req, res, function(err) {
        console.log("File uploaded");
        res.end('File is uploaded')
    })
})

app.listen(3000,function(){
console.log("working on port 3000");
});

创建一个 views 文件夹并将此 index.ejs 文件放入其中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form id="uploadForm" enctype="multipart/form-data" method="post">
        <input type="file" name="userFile" />
        <input type="submit" value="Upload File" name="submit">
    </form>
</body>
</html>

在此之后 运行 服务器为 node app.js。打开浏览器并在 运行nig this url 之后输入 http://localhost:3000/api/file 选择一个你想要的文件上传到目的地 folder.And 在终端和 browser.Hope 中都有成功的响应,这对你有帮助。

在我看来,您看到的是临时上传文件和您保存的文件。如果您添加删除临时文件的代码 (req.files[0].path).

,您的代码应该可以正常工作