8

我是 Node.js 的新手,最近遇到了一个简单的问题。

我正在使用multer模块上传图片。在我的网络应用程序中,所有用户都有一个唯一的 ID,我希望上传的图像存储在一个目录中,以根据他们的 ID 命名。

例子:

.public/uploads/3454367856437534

这是我routes.js文件的一部分:

// load multer to handle image uploads
var multer  = require('multer');
var saveDir = multer({
  dest: './public/uploads/' + req.user._id, //error, we can not access this id from here
  onFileUploadStart: function (file) { 
  return utils.validateImage(file); //validates the image file type
  }
});

module.exports = function(app, passport) {

app.post('/', saveDir, function(req, res) {
                id     : req.user._id,  //here i can access the user id
    });
});

}

如何访问req.user._id回调之外的属性function(req, res),以便我可以使用它multer来根据 id 生成正确的目录?

编辑这是我尝试过但没有奏效的方法:

module.exports = function(app, passport) {

app.post('/', function(req, res) {
    app.use(multer({
        dest: './public/uploads/' + req.user._id
    }));
});

}
4

3 回答 3

9

更新

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

multer 1.2.1.

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

注意:在将目标提供为函数时,您有责任创建目录。

更多在这里

'use strict';

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

let upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, callback) => {
      let userId = req.user._id;
      let path = `./public/uploads//${userId}`;
      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('/', upload.single('file'), (req, res) => {
  res.status(200).send();
});

fs-extra用于创建目录,以防万一它不存在

原始答案

您可以使用changeDest

重命名放置上传文件的目录的函数。

v0.1.8 开始提供

app.post('/', multer({
dest: './public/uploads/',
changeDest: function(dest, req, res) {
    var newDestination = dest + req.user._id;
    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
});
于 2015-03-11T07:41:45.087 回答
0

您可以使用 multer 来处理上传目录的动态创建。应该在发送文件名之前调用输入参数(您要为其创建目录)。

var express = require('express');
var app = express();
var multer = require('multer');
var fs = require('fs');
var mkdirp = require('mkdirp');
var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '5mb'}));
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
    extended: true,
    limit: '5mb'
}));

var storage =   multer.diskStorage({
    destination: function (req, file, callback) {
        var Id = req.body.id;
        upload_path = "./"+Id;
        mkdirp(upload_path, function (err) {
            if (err) console.error(err)
            else {
                console.log('Directory created');
                //setting destination.
                callback(null, upload_path);
            }
        });

    },
    filename: function (req, file, callback) {
        callback(null, file.orginalname)
    }
});
//multer setting and getting paramaters.
var upload = multer({ storage : storage }).single('upload_file');

//creating request for upload file
app.post('/uploadFile', function(req, res){
    res.set({ 'content-type': 'application/json; charset=utf-8' });
    res.header("Content-Type", "application/json; charset=utf-8");
    res.header("Access-Control-Allow-Origin", "*");
    res.charset = 'utf-8';
    //function upload_process(){
    upload(req, res, function(err){
        if(err){
            console.log('Error-->');
            console.log(err);
            res.json({"status": "Failure", "message":'There was a problem uploading your files.'+err});
            return;
        }
        else{
            console.log("fieldname"+req.files.length);
            if( req.files.length != 0){
                res.json({"status" : "Success", "message":'Your files are uploaded.'});
                console.log('File uploaded!');
            }
            else{
                console.log("No file uploaded. Ensure file is uploaded.");
                res.json({"status" : "Failure", "message" : 'No file uploaded. Ensure file is uploaded.'});

            }
        }
    });

});

});

希望这可以帮助!快乐编码

于 2017-08-07T12:20:07.103 回答
0

您可以仅参考输入名称并在分配路径之前重命名路径来解决此问题。

app.use(multer({ dest: './standard_folder/',
    rename: function (fieldname, filename) {

      var pathHelper ='';
      if(fieldname =='otherKindOfFolderNeeded'){
        pathHelper = '../../path/to/other/folder/';
      }
      return pathHelper+uuid.v4()+Date.now();
    },
    onFileUploadStart: function (file) {
      console.log(file.originalname + ' is starting ...')
    },
    onFileUploadComplete: function (file) {
      console.log(file.fieldname + ' uploaded to  ' + file.path)
      done=true;
    }
  })
);
于 2015-07-23T22:38:59.337 回答