如何使用multer在nodejs中设置不同的目的地? [英] How to set different destinations in nodejs using multer?

查看:80
本文介绍了如何使用multer在nodejs中设置不同的目的地?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Multer 包上传任何文件.当我在 server.js 文件中使用以下代码时,它工作正常.

var express = require('express'),app = express(),multer = require('multer');app.configure(函数(){app.use(multer({dest: './static/uploads/',重命名:函数(字段名,文件名){返回文件名.replace(/\W+/g, '-').toLowerCase();}}));app.use(express.static(__dirname + '/static'));});app.post('/api/upload', 函数 (req, res) {res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});});var server = app.listen(3000, function () {console.log('监听端口 %d', server.address().port);});

我想要的是将文件存储在不同的位置.我曾尝试以下代码,但它对我不起作用.

var express = require('express'),app = express(),multer = require('multer');app.configure(函数(){app.use(multer({//dest: './static/uploads/',重命名:函数(字段名,文件名){返回文件名.replace(/\W+/g, '-').toLowerCase();}}));app.use(express.static(__dirname + '/static'));});app.post('/api/pdf', function (req, res) {app.use(multer({ dest: './static/pdf/'}));res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});});app.post('/api/image', function (req, res) {app.use(multer({ dest: './static/image/'}));res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});});app.post('/api/video', function (req, res) {app.use(multer({ dest: './static/video/'}));res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});});var server = app.listen(3000, function () {console.log('监听端口 %d', server.address().port);});

意思是,如果我点击 http://localhost:3000/api/pdf 文件应该存储在 'pdf' 文件夹中,如果我点击 http://localhost:3000/api/video 文件应存储在video"文件夹中.

有什么办法可以达到这个目标吗?

提前致谢.

解决方案

更新

自从我发布原始答案以来,很多事情都发生了变化.

使用 multer 1.2.1.

  1. 您需要使用 DiskStorage 来指定 where &存储文件的方式.
  2. 默认情况下,multer 将使用操作系统的默认目录.在我们的例子中,因为我们对位置很挑剔.我们需要确保该文件夹存在,然后才能将文件保存在那里.

<块引用>

注意:将目的地作为函数提供时,您负责创建目录.

更多这里

'use strict';让multer = require('multer');让 fs = require('fs-extra');让上传 = multer({存储:multer.diskStorage({目的地:(请求,文件,回调)=>{让 type = req.params.type;让路径 = `./uploads/${type}`;fs.mkdirsSync(路径);回调(空,路径);},文件名:(请求,文件,回调)=>{//originalname 是上传文件的名称和 extn回调(空,文件.原始名称);}})});app.post('/api/:type', upload.single('file'), (req, res) => {res.status(200).send();});

fs-extra 用于创建目录,就在不存在的情况

原答案

您可以使用 changeDest.

<块引用>

重命名放置上传文件的目录的功能.

可从 v0.1.8

获得

app.post('/api/:type', multer({目标:'./上传/',changeDest: 函数(dest, req, res) {var newDestination = dest + req.params.type;var stat = null;尝试 {stat = fs.statSync(newDestination);} 抓住(错误){fs.mkdirSync(newDestination);}如果(统计&& !stat.isDirectory()){throw new Error('无法创建目录,因为在' + dest + '"'处存在不同类型的inode);}返回新目的地}}), 函数(req, res) {//设置你的响应});

I'm trying to upload any file using Multer package. It's working fine when I use following code in my server.js file.

var express = require('express'),
    app = express(),
    multer = require('multer');
app.configure(function () {
    app.use(multer({
        dest: './static/uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase();
        }
    }));
    app.use(express.static(__dirname + '/static'));
});

app.post('/api/upload', function (req, res) {
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

var server = app.listen(3000, function () {
    console.log('listening on port %d', server.address().port);
});

What I want is to store file at different locations. I had tried following code but it does not work for me.

var express = require('express'),
    app = express(),
    multer = require('multer');
app.configure(function () {
    app.use(multer({
        //dest: './static/uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase();
        }
    }));
    app.use(express.static(__dirname + '/static'));
});

app.post('/api/pdf', function (req, res) {
    app.use(multer({ dest: './static/pdf/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

app.post('/api/image', function (req, res) {
    app.use(multer({ dest: './static/image/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

app.post('/api/video', function (req, res) {
    app.use(multer({ dest: './static/video/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

var server = app.listen(3000, function () {
    console.log('listening on port %d', server.address().port);
});

Means, if I hit http://localhost:3000/api/pdf file should store at 'pdf' folder, if I hit http://localhost:3000/api/video file should store at 'video' folder.

Is there any way to achieve this aim?

Thank you in advance.

解决方案

Update

Quite a few things have changed since I posted the original answer.

With multer 1.2.1.

  1. You need to use DiskStorage to specify where & how of the stored file.
  2. By default, multer will use the operating system's default directory. In our case, since we are particular about the location. We need to ensure that the folder exists before we could save the file over there.

Note: You are responsible for creating the directory when providing destination as a function.

More here

'use strict';

let multer = require('multer');
let fs = require('fs-extra');

let upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, callback) => {
      let type = req.params.type;
      let path = `./uploads/${type}`;
      fs.mkdirsSync(path);
      callback(null, path);
    },
    filename: (req, file, callback) => {
      //originalname is the uploaded file's name with extn
      callback(null, file.originalname);
    }
  })
});

app.post('/api/:type', upload.single('file'), (req, res) => {
  res.status(200).send();
});

fs-extra for creating directory, just in case if it doesn't exists

Original answer

You can use changeDest.

Function to rename the directory in which to place uploaded files.

It is available from v0.1.8

app.post('/api/:type', multer({
dest: './uploads/',
changeDest: function(dest, req, res) {
    var newDestination = dest + req.params.type;
    var stat = null;
    try {
        stat = fs.statSync(newDestination);
    } catch (err) {
        fs.mkdirSync(newDestination);
    }
    if (stat && !stat.isDirectory()) {
        throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
    }
    return newDestination
}
}), function(req, res) {
     //set your response
});

这篇关于如何使用multer在nodejs中设置不同的目的地?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆