Multer用数据创build新的文件夹

我使用Muller 。

问题1

当我把下面的代码片段放在app.js

 app.use(multer({ dest: './uploads' } ).single('file')); 

它创build一个新的文件夹下的根文件夹,我的问题是关于这个新文件夹的lifeCycle,当它将被删除? 100次电话后文件夹的大小可能是多less?

问题2

如果我不想限制文件大小,我应该在configuration中放置什么?

 app.use(multer({ dest: './public/profile/img/', limits: { fieldNameSize: 50, files: 1, fields: 5, fileSize: 1024 * 1024 }, 

更新

我的应用程序是像

包含app.js文件

  app.use(multer({ dest: './uploads' } ).single('file')); app.use('/', routes, function (req, res, next) { next(); }); 

路由文件如下所示

 appRouter .post('*', function (req, res) { handler.dispatch(req, res) }) .get('*', function (req, res) { handler.dispatch(req, res) }) 

在第三个文件中,我使用下面的解压缩

 update: function (req, res) { var filePath = path.join(req.file.destination, req.file.filename); var unzipper = new Unzipper(filePath); unzipper.on("extract", function () { console.log("Finished extracting"); res.sendStatus(200); }); unzipper.on('progress', function (fileIndex, fileCount) { console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount); }); unzipper.on('list', function (files) { console.log('The archive contains:'); console.log(files); }); unzipper.on('error', function (err) { console.log('Caught an error', err); }); unzipper.extract({ path: "./" }); } 

下面是如何我的节点应用程序的结构,可以请人build议如何以及在哪里(哪个文件)其推荐使用的Raf代码添加一个dateTime的文件,我可以添加sorting…

我会试着用一个真实的例子来回答你的问题,至less你可能会从中学到一些东西。 如果您希望删除除最近上传以外的所有内容,那么您需要编写某种逻辑来区分哪些上传是最新的,哪些是最新的。 下面我描述一下,我将如何去解决这个问题,可能不完美,但是,我是这么做的。

该文件夹将永远不会自动删除,除非您手动或以编程方式删除它。

有100个电话的文件夹的大小,假定在每次通话中你上传一个x大小的文件将被乘以100

您不想限制file upload,不提供限制configuration,但build议指定file upload限制。

你显然可以将这个Mulder附加到应用程序中,或者创build它的一个实例并将其传递给一个path。 我更喜欢第二种方法:

Mullerconfiguration

 var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { var filename = file.originalname; var fileExtension = filename.split(".")[1]; cb(null, Date.now() + "." + fileExtension); } }); 

如上所示,我不会让multer给上传的文件一个随机的名字。 我所做的是,获取文件名,剥离其扩展名,然后使用Date.now()将给我当前时间戳附加上传的文件扩展名。 如果我做了六个上传,他们会显示如下(我的上传大部分是.jpg,这是从文件名)。

如何上传最终(时间戳会有所不同)

 1453414099665.jpg (oldest) 1453414746114.JPG 1453414748991.jpg 1453414751662.jpg 1453414754815.jpg (most recent) 

我将上面的storage附加到一个multer的实例如下:

 var upload = multer({storage: storage}); 

现在我可以通过upload到处理file upload的路线如下:

附加上传到路由,如下所示

 //simple route to return upload form, simple jade file app.get('/upload', function(req, res){ res.render('upload'); }); //this route processes the upload request, see below upload.single('file') //is the passed multer app.post('/upload', upload.single('file'), function(req,res){ res.status(204).end(); }); 

比方说,你继续上传,然后在某个时候你想列出上传目录中的所有文件。 路线如下:

列出上传目录中的所有文件

 //lists all files in the uploads directory and return it to browser as json response app.get('/listAllFiles', function(req, res) { //reading directory in synchronous way var files = fs.readdirSync('./uploads'); res.json(files); }); 

您想要删除上传目录中的所有文件,路线如下所示:

删除上传目录中的所有文件

 //delete all files in the upload direcotry asynchronously app.get('/deleteAllFiles', function(req, res) { fs.readdir('./uploads', function(err, items) { items.forEach(function(file) { fs.unlink('./uploads/' + file); console.log('Deleted ' + file); }); res.status(204).end(); }); }); 

如果您希望同步删除所有文件,则必须调用readdir(readdirSync)的同步版本并取消链接(unlinkSync)

 var filenames = fs.readdirSync('./uploads'); filenames.forEach(function(file) { fs.unlinkSync('./uploads/' + file); }); 

现在您要删除最近上传的文件。 那么,我已经使所有的文件名是时间戳。 所以我会做一些如下的事情:

删除除最近(除了最近的时间戳最近的文件名)以外的所有文件。

 //delets all file asynchronously except the most recent in which case the file //with name being the latest timestamp is skipped. app.get('/deleteAllExceptMostRecent', function(req, res) { console.log('/deleteAllFilesExceptMostRecent'); fs.readdir('./uploads', function(err, items) { //sort the array of files names in reverse, so we have most recent file on top items.reverse(); var flag = true; items.forEach(function(file) { //skip deletion of most recent file. if condition executed onces only. if(flag) { flag = false; } else { fs.unlink('./uploads/' + file); console.log('Deleted ' + file); } }); }); res.status(204).end(); }); 

我没有在我的例子中添加任何限制,但build议。 默认的文件大小限制是无限的,如果你没有把它包含在产品环境中,那么你将很容易受到注释中所示的DoS攻击。

为了使上述文件操作起作用,您需要加载

 var fs = require('fs'); 

关于第二点,只需跳过限制属性,默认限制将是无限的。

为了演示目的,我已经在一个工作的nodejs应用程序中设置了上面的内容,如下所示:

app.js

 var express = require('express'); var multer = require('multer'); var bodyParser = require('body-parser'); var path = require('path'); var fs = require('fs'); var app = new express(); app.use(bodyParser.json()); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { /* if you need to retain the original filename, then use filename and append to it date * if you don't need original filename but, just extension, then append extension at the * end of current timestamp. If you don't need extenion then just use Date.now() which */ var filename = file.originalname; var fileExtension = filename.split(".")[1]; cb(null, Date.now() + "." + fileExtension); } }) var upload = multer({storage: storage}); //get upload form app.get('/upload', function(req, res){ res.render('upload'); }); //process upload app.post('/upload', upload.single('file'), function(req,res){ res.status(204).end(); }); //lists all files in the uploads directory. app.get('/listAllFiles', function(req, res) { var files = fs.readdirSync('./uploads'); res.json(files); }); //delete all files in the upload direcotry asynchronously app.get('/deleteAllFiles', function(req, res) { fs.readdir('./uploads', function(err, items) { items.forEach(function(file) { fs.unlink('./uploads/' + file); console.log('Deleted ' + file); }); res.status(204).end(); }); }); //delets all file asynchronously except the most recent in which case the file //with name being the latest timestamp is skipped. app.get('/deleteAllExceptMostRecent', function(req, res) { console.log('/deleteAllFilesExceptMostRecent'); fs.readdir('./uploads', function(err, items) { items.reverse(); var flag = true; items.forEach(function(file) { if(flag) { flag = false; } else { fs.unlink('./uploads/' + file); console.log('Deleted ' + file); } }); }); res.status(204).end(); }); //delete all files of a direcotry in synchronous way app.get('/deleteAllSync', function(req, res) { var filenames = fs.readdirSync('./uploads'); filenames.forEach(function(file) { fs.unlinkSync('./uploads/' + file); }); }); //delete all files except most recent in synchronous way app.get('/deleteAllSyncExceptMostRecent', function(req, res) { var filenames = fs.readdirSync('./uploads'); filenames.reverse(); var flag = true; filenames.forEach(function(file) { if(flag) flag = false; else fs.unlinkSync('./uploads/' + file); }); }); var port = 3000; app.listen( port, function(){ console.log('listening on port '+port); } ); 

意见/ upload.jade

 html head title body form(method="post",enctype="multipart/form-data",action="/upload") p input(type="file",name="file") p input(type="submit") 

(1)当你打电话给你时,你正在告诉multer将上传的文件放到一个名为uploads的目录中。 所以如果你的应用程序启动时它不存在,它会为你创build这个目录。

 app.use(multer({ dest: './uploads' } ).single('file')); 

就目录的生命周期而言,只要你不删除它,它就会一直呆在那里,并且仍然要求multer把它作为目的地。 上传的文件正在被添加,因此其内容的大小取决于正在上传的内容。

(2)至于限制文件大小,根据文档默认为无穷大。 所以没有限制,除非你设置一个。

但是,不知道你的申请,我仍然强烈build议设定一个限制,即使你需要它相当高。 完全取消尺寸限制可能会导致很大的问题。


编辑
如果您想要在上载新文件时删除./uploads的内容,Node会提供一种删除文件的方法: fs.unlink 。 另请参阅关于删除节点中的文件的操作

在上传处理程序中,检查./uploads的内容,并unlink与当前请求中使用的文件不同的文件。 查看当前上传的req.file

阙1)您可以决定文件夹的生命周期。

  1. 如果你想在服务器上存储文件并在没有文件大小限制的情况下随时取回文件,则需要更大的存储空间
  2. 如果您使用Amazon S3等第三方进行存储,则无需在本地进行存储,只要将其上传到服务器,即可从本地存储中删除。 响应发送后您可以使用Hook之后 。

     app.use(function (req, res, next) { function afterResponse() { res.removeListener('finish', afterRequest); res.removeListener('close', afterRequest); // Delete files from multer // you can delete older one from upload folder as you see new one came here. } res.on('finish', afterResponse); res.on('close', afterResponse); // action before request // eventually calling `next()` }); 

阙2)默认是无限的。