gpt4 book ai didi

javascript - Multer 使用数据创建新文件夹

转载 作者:IT老高 更新时间:2023-10-28 22:03:11 27 4
gpt4 key购买 nike

我使用 multer .

问题 1

当我将以下代码段放入 app.js

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

它会在根文件夹下创建一个新文件夹,我的问题是关于这个新文件夹的生命周期,什么时候会被删除? 100次调用后文件夹的大小可以是多少?

问题 2

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

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: "./"
});
}

以下是我的 Node 应用程序的结构,有人可以建议如何以及在哪里(哪个文件)它的推荐使用 Raf 代码向文件添加 dateTime,我可以添加排序...

最佳答案

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

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

100 次调用的文件夹大小假设在每次调用中您上传 x 大小的文件将是 x 乘以 100

您不想限制文件上传,不要提供限制配置,但建议指定文件上传限制。

您显然可以将 multer 附加到应用程序或创建它的实例并将其传递给路由。我更喜欢第二种方法:

多重配置

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 传递给处理文件上传的路由,如下所示:

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

//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();
});

我没有在我的示例中添加任何限制,但建议这样做。默认文件大小限制是无限的,如果您不将其包含在 prod 环境中,那么您将容易受到 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); } );

views/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")

关于javascript - Multer 使用数据创建新文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34590386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com