使用node.js上传文件,获取多个文件

3
我有这样的代码,可以使用Node.js、Express和Multer上传单个文件:
var express = require("express");
var app = express();
var fs = require("fs");
var multer  = require('multer');
var upload = multer({ dest: 'uploads/' });

// Process upload file
app.post('/file_upload', upload.single('single-file'), function(request, response) {

    var fileName = request.file.originalname;
    var filePath = request.file.path;
    var file = __dirname + "/uploads/" +  fileName;

    fs.readFile(filePath, function(err, data) {
        fs.writeFile(file, data, function(err) {
            if (err) {
                console.log(err);
            } else {
                responseData = {
                    'message' : 'File uploaded successfully',
                    'fileName' : fileName
                };
            }

            response.end(JSON.stringify(responseData));
        })
    });
});

以下是HTML文件:

<!DOCTYPE html>
<html>
    <head>
        <title>File Uploading Form</title>
    </head>
    <body>
        <h3>File Upload:</h3>
        Select a file to upload: <br />
        <form action="http://localhost:8081/file_upload" method="POST" 
      enctype="multipart/form-data">
            <input type="file" name="single-file" size="50" />
            <br />
            <input type="submit" value="Upload File" />
        </form>
    </body>
</html>

运行代码后,我成功上传了文件。 但问题是,每次我都会在我的“uploads”文件夹中得到两个上传的文件。一个文件是原始名称,另一个文件是类似于2787ab2db292d90bd2da83a6a6ce1700这样的奇怪名称。

这正常吗?我该如何在上传时摆脱另一个文件?


在你的表单中添加 enctype="multipart/form-data" - AdityaParab
我已经在我的HTML中完成了这个。 - Trong Hoang
1个回答

2
问题是您正在从已上传的文件创建新文件。
因此,解决方案是将已上传的文件重命名为原始名称:
var express = require("express");
var app = express();
var fs = require("fs");
var multer  = require('multer');
var uploadsFolder = __dirname + '/uploads/';  // defining real upload path
var upload = multer({ dest: uploadsFolder }); // setting path for multer

// Process upload file
app.post('/file_upload', upload.single('single-file'), function(request, response) {

    var fileName = request.file.originalname; // original file name
    var file = request.file.path; // real file path with temporary name

    // renaming real file to it's original name
    fs.rename(file, uploadsFolder + fileName, function (err) {
      if (err) {
        console.log(err);
        response.json({success:false, message: err});
        return;
      }

      response.json({success:true, message: 'File uploaded successfully', fileName: fileName});
    });
});

或者使用Multer将文件上传到临时文件夹,然后再复制或移动到上传文件夹:
安装fs-extra:
npm install --save fs.extra

并且
var express = require("express");
var app = express();
var fs = require('fs.extra'); // extra functionality
var multer  = require('multer');
var uploadsFolder = __dirname + '/uploads/';  // defining real upload path
var tempFolder = __dirname + '/tmp/'; // folder for temporary files, must exist
var upload = multer({ dest: tempFolder }); // setting path for multer

// Process upload file
app.post('/file_upload', upload.single('single-file'), function(request, response) {

    var fileName = request.file.originalname; // original file name
    var file = request.file.path; // real file path with temporary name

    // renaming real file to it's original name
    fs.move(file, uploadsFolder + fileName, function (err) {
      if (err) {
        console.log(err);
        response.json({success:false, message: err});
        return;
      }

      response.json({success:true, message: 'File uploaded successfully', fileName: fileName});
    });
});

1
非常好用!谢谢你。但是为什么你使用 'fs.extra' 而不是 'fs'?这是因为 fs.copy 吗? - Trong Hoang
1
是的,fs extra具有复制、移动等功能,非常方便。例如,您正在创建文件,从源读取并写入目标。它做的是相同的事情,但您只使用fs.copy,这使得您的代码更短。Fs.move是复制、重命名和删除的组合。 - num8er

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接