我还不清楚这个概念。 对于一个非常基本的情况,我可以使用multer上传文件(比如myFile.txt),并将其原始名称保留在服务器端。
const upload = multer({ dest: `${UPLOAD_PATH}/` }); // multer configuration
现在另一个人碰巧将具有相同文件名myFile.txt的不同文件上传到服务器端的同一文件夹。它会覆盖前一个吗?
你通常如何管理这个?谢谢!
答案 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);
}