如何返回上传文件的id(在nodejs express app中使用multer上传)

时间:2017-08-25 22:03:32

标签: node.js express multer

我有一个MEAN堆栈应用程序并尝试使用multer上传文件。上传工作正常唯一的问题是我想返回上传文件的ID。

//multer settings for single upload
var upload = multer({ storage: storage }).single('file');

app.post('/upload', upload, function (req, res) {
//// ????? What to return and how? 
});

我订阅了这篇文章到angular2服务。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

var multer = require('multer');

// storage for upload file.
 var storage  = multer.diskStorage({
     destination: function (req, file, callback) {
     callback(null, './file');
  },
  filename: function (req, file, callback) {
     callback(null, file.originalname);
  }
 });

 var Upload = multer({
    storage: storage 
 }).any('file');


 router.post('/upload', postData);

function postData(req, res) {
 Upload(req, res, function (error) {
    if (error) {
        res.status(400).send(error);
    }
    var obj = {};
    obj.file = req.files.filename;
    //file is getting stored into database and after it successfully stored 
    //into database it will return you Id
    db.create(obj, function (err, data) {
                        if (err) {
                            res.send('error');
                        }
                        if (!data) {
                            res.send('Error');
                        } else {
                            console.log('file upload');
                            res.send(data._id);
                        }
                    });
            });
       }

要返回Id,您必须在数据库中的某处存储引用,之后您将id返回Angular2

答案 1 :(得分:0)

请求文件对象(req.file)不包含任何唯一ID,您必须滚动自己的ID分配逻辑。

您必须考虑您需要该ID的目的,然后您可以使用存储在请求文件对象(req.file)中的信息使其特定于该文件。

例如,如果所有文件都存储在同一个路径中,并且稍后将使用该ID来检索该文件,那么您必须考虑一个不会给用户输入带来问题的策略。

使用multer上传的每个文件都包含以下信息:

**:Key:**       **:Description:**

fieldname       Field name specified in the form    
originalname    Name of the file on the user's computer     
encoding        Encoding type of the file   
mimetype        Mime type of the file   
size            Size of the file in bytes   
destination     The folder to which the file has been saved (DiskStorage only) 
filename        The name of the file within the destination (DiskStorage only)
path            The full path to the uploaded file          (DiskStorage only)
buffer          A Buffer of the entire file                 (MemoryStorage only)

因此,您可以使用文件名(在表单中使用)req.file.fieldname

或原始文件req.file.originalname(但使用originalname只会在多次上传相同文件名时产生问题,因此......)

更好的是,通过将当前日期时间戳与filename/original组合起来为文件创建唯一字符串,如:timestamp-filename.ext

或生成随机哈希(使用字符串timestamp-filename.ext的示例) 5910c2f5df0471320b8fc179fa6dc1114c1425752b04127644617a26a373694a(SHA256)

答案 2 :(得分:0)

如果您使用Mongo DB(GridFs-stream)存储文件,则上传函数的res对象具有res.req.file下的对象,其中包含上传文件的元数据和网格详细信息的所有详细信息下面:

{  
   fieldname:'file',
   originalname:'Screenshot (1).png',
   encoding:'7bit',
   mimetype:'image/png',
   filename:'file-1516342158216.png',
   metadata:{  
      originalname:'Screenshot (1).png',
      email:'prasan.g8@gmail.com',
      imageType:'ProfilePic'
   },
   id:5   a618b8e1d9af11f388dcabb,
   grid:{  
      _id:5      a618b8e1d9af11f388dcabb,
      filename:'file-1516342158216.png',
      contentType:'image/png',
      length:675410,
      chunkSize:261120,
      uploadDate:2018-01      -19      T06:09:18.736      Z,
      aliases:undefined,
      metadata:{  
         originalname:'Screenshot (1).png',
         email:'prasan.g8@gmail.com',
         imageType:'ProfilePic'
      },
      md5:'fdda12a2f098a915c24162dc410cb3b6'
   },
   size:undefined
}