nodejs multer文件上传,文件名从2个地方发生的变化是什么

时间:2017-08-19 20:36:50

标签: node.js multer

我还不清楚这个概念。 对于一个非常基本的情况,我可以使用multer上传文件(比如myFile.txt),并将其原始名称保留在服务器端。

const upload = multer({ dest: `${UPLOAD_PATH}/` }); // multer configuration

现在另一个人碰巧将具有相同文件名myFile.txt的不同文件上传到服务器端的同一文件夹。它会覆盖前一个吗?

你通常如何管理这个?谢谢!

3 个答案:

答案 0 :(得分:1)

  

它会覆盖前一个吗?

是的,它肯定会替换为新的。这是我的代码。在此代码中,如果您使用来自不同位置或同一位置的相同文件名,则不会替换它。它会保留两个文件destination.Server代码server.js

var express=require('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')
    },
    filename: function(req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
        //callback(null, 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");
});

如果您观察代码callback(null, file.originalname),此行会将原始文件名保留在目标位置,并在文件名称相同时替换该文件。如果您不想这样,请使用{{1}这个回调会改变目标文件的名称。

制作一个观看文件夹,并将此文件保存在..ejs代码中,您可以从中选择要上传的文件callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))

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> 运行。打开浏览器并输入server.js。选择要上传的文件并查看目标文件夹。希望这对您有所帮助。

答案 1 :(得分:0)

实际上,Multer将文件保存在给定的路径中(由您指定),但使用不同的随机文件名。即使文件名相同,它也不会覆盖文件。 因此,即使您再次加载具有相同名称的文件,您的UPLOAD_PATH也会有多个文件。

答案 2 :(得分:0)

您可以进一步确保文件名更具体:

filename: (req, file, cb) => {
    let fn = file.originalname.split(path.extname(file.originalname))[0] + '-' + Date.now() + path.extname(file.originalname);
    cb(null, /* file.originalname */ fn);
}