节点 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).
,您的代码应该可以正常工作
我正在使用以下代码允许人们将图像上传到服务器:
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).
,您的代码应该可以正常工作