在多部分请求节点js

时间:2018-08-07 05:41:09

标签: javascript node.js express multer

我正在尝试在用户加载文件时动态创建文件夹(这是因为我需要分别存储每个用户文件,因此如果删除文件则不会有冲突)并在计算机中创建文件路径,以便我可以存储它在数据库的多对多关系表中(用户可以有多个文件,并且许多文件可以属于不同的用户,这就是为什么我不能将它们存储在一起的原因),但是我无法用当前的逻辑来获取它。我可以用时间戳创建其他名称,但会变得混乱。

我正在使用multerExpress。发送的表单数据就是所附图像上的表单数据。

formdata

const express = require('express');
const app = express();
const multer = require('multer');
const bodyParser = require('body-parser');
const fs = require('fs');


router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: false }));


let storage = multer.diskStorage({
    destination: function (req, file, cb) {
      //req.body is empty
      let path = `./public/uploads/${req.body.id}`;
      if (!fs.existsSync(path)) {
          fs.mkdirSync(filesDir);
      }
      cb(null, path);
    },
    filename: function (req, file, cb) {
      cb(null, `${file.originalname}`)
       }
})

let upload = multer({storage:storage});
var cpUpload = upload.fields([{ name: 'file', maxCount: 1}, { name: 'id'}]);

router.post('/uploadSingFile', cpUpload,(req,res)=>{
    console.log(req.body); req.body is ok
    res.send({status:200});
});

以某种方式,请求对象在目标函数中没有主体,但在后请求中具有主体。考虑到中间件在Node中的工作方式,我认为这可以工作,存储功能应具有与后期请求相同的请求对象。

1 个答案:

答案 0 :(得分:0)

您可以对文件名使用新生成的uuid,以使其在文件夹中具有唯一性。对于文件夹名称,请使用req.body.id之类的方法来确保该文件夹属于特定用户,而不是从请求正文(userId)中获取它。