我正在使用multer diskstorage将文件保存到磁盘。 我首先将它保存到磁盘并对文件执行一些操作,然后使用另一个函数和lib将其上载到远程存储桶。 上传完成后,我想将其从磁盘中删除。
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/tmp/my-uploads')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})
var upload = multer({ storage: storage }).single('file')
以下是我如何使用它:
app.post('/api/photo', function (req, res) {
upload(req, res, function (err) {
uploadToRemoteBucket(req.file.path)
.then(data => {
// delete from disk first
res.end("UPLOAD COMPLETED!");
})
})
});
如何使用diskStorage删除功能删除临时文件夹中的文件? https://github.com/expressjs/multer/blob/master/storage/disk.js#L54
我决定将其模块化并将其放在另一个文件中:
const fileUpload = function(req, res, cb) {
upload(req, res, function (err) {
uploadToRemoteBucket(req.file.path)
.then(data => {
// delete from disk first
res.end("UPLOAD COMPLETED!");
})
})
}
module.exports = { fileUpload };
答案 0 :(得分:4)
不需要Multer。只需使用此代码即可。
const fs = require('fs')
const path = './file.txt'
fs.unlink(path, (err) => {
if (err) {
console.error(err)
return
}
//file removed
})
答案 1 :(得分:3)
您无需使用multer
删除该文件,除了_removeFile
是一个私人功能,您应该不使用。
您可以像往常一样通过fs.unlink
删除该文件。因此,只要您有权访问req.file
,就可以执行以下操作:
const fs = require('fs')
const { promisify } = require('util')
const unlinkAsync = promisify(fs.unlink)
// ...
const storage = multer.diskStorage({
destination(req, file, cb) {
cb(null, '/tmp/my-uploads')
},
filename(req, file, cb) {
cb(null, `${file.fieldname}-${Date.now()}`)
}
})
const upload = multer({ storage: storage }).single('file')
app.post('/api/photo', upload, async (req, res) =>{
// You aren't doing anything with data so no need for the return value
await uploadToRemoteBucket(req.file.path)
// Delete the file like normal
await unlinkAsync(req.file.path)
res.end("UPLOAD COMPLETED!")
})
答案 2 :(得分:0)
您也可以考虑使用 MemoryStorage 用于此目的,使用此存储,文件永远不会存储在磁盘中,而是存储在内存中,并且在执行离开控制器块后自动从内存中删除,即在您在大多数情况下提供响应。
当您使用此存储选项时,您不会得到字段 file.destination
、file.path
和 file.filename
,而是会得到一个字段 file.buffer
作为名称建议是一个缓冲区,您可以将此缓冲区转换为所需的格式进行操作,然后使用流对象上传。
大多数流行的库都支持流,因此您应该能够使用流直接上传文件,将缓冲区转换为流的代码:
const Readable = require('stream').Readable;
var stream = new Readable();
stream._read = () => { }
stream.push(file.buffer);
stream.push(null);
// now you can pass this stream object to your upload function
这种方法会更有效,因为文件将存储在内存中,这将导致更快的访问,但它确实有 multer
文档中提到的缺点:
警告:上传非常大的文件或相对较小的文件 非常快的大量数字,可能会导致您的应用程序用完 使用内存存储时的内存。
答案 3 :(得分:0)
为了在所有路线上真正自动执行此操作,我使用了此策略:
当请求结束时,我们删除所有上传的文件(req.files)。在此之前,如果要将文件保留在服务器上,则需要将它们保存在其他路径中。
var express = require('express');
var app = express();
var http = require('http');
var server = http.Server(app);
// classic multer instantiation
var multer = require('multer');
var upload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
cb(null, `${__dirname}/web/uploads/tmp/`);
},
filename: function (req, file, cb) {
cb(null, uniqid() + path.extname(file.originalname));
},
}),
});
app.use(upload.any());
// automatically deletes uploaded files when express finishes the request
app.use(function(req, res, next) {
var writeHead = res.writeHead;
var writeHeadbound = writeHead.bind(res);
res.writeHead = function (statusCode, statusMessage, headers) {
if (req.files) {
for (var file of req.files) {
fs.unlink(file.path, function (err) {
if (err) console.error(err);
});
}
}
writeHeadbound(statusCode, statusMessage, headers);
};
next();
});
// route to upload a file
router.post('/profile/edit', access.isLogged(), async function (req, res, next) {
try {
// we copy uploaded files to a custom folder or the middleware will delete them
for (let file of req.files)
if (file.fieldname == 'picture')
await fs.promises.copy(file.path, `${__dirname}/../uploads/user/photo.jpg`);
} catch (err) {
next(err);
}
});