【问题标题】:Node.js: set Multer destination based on FormData valuesNode.js:根据 FormData 值设置 Multer 目的地
【发布时间】:2017-12-15 22:32:29
【问题描述】:

我正在创建一个XMLHttpRequest (xhr),它将一个包含文件和一些值的FormData 对象发送到Node.js(Express) 服务器。我正在使用Multer,因为我不能将bodyParsermultipart 数据一起使用。

router.post("/submit", function(req, res) {
    var storage = multer.diskStorage({
        // set destination here
    })

    var upload = multer({ storage: storage }).any();

    upload(req, res, function (err) {
        // I can access req.body here
    });
});

我在storage 中设置的destination 将取决于body 对象的值(如req.body.product)。但在调用multer() 之前,我无法访问req.body。在设置multer.storage之前如何访问req.body

【问题讨论】:

    标签: javascript node.js express xmlhttprequest multer


    【解决方案1】:

    您需要为diskStorage() as shown in the multer documentation 使用destination 配置属性。例如:

    var storage = multer.diskStorage({
      destination: function(req, file, cb) {
        var newAbsoluteDir = /* calculate based on `req.body` here */;
        cb(null, newAbsoluteDir);
      }
    });
    
    var upload = multer({ storage });
    
    // ...
    
    router.post('/submit', upload.any(), function(req, res) {
      // ...
    });
    

    如文档所述,您需要在这些 multer 回调中访问的任何非文件字段都需要位于您正在处理的文件字段之前,因为 multipart/form-data 请求的字段已排序。因此,如果您有一个静态 HTML 表单,那么重要的是输入、选择等元素的文字位置。对于 XHR,这是您为每个字段调用 formData.append() 的顺序。

    【讨论】:

    • 谢谢 :') 就像您在答案中提到的那样,我不得不更改调用 formData.append() 的顺序,以将文本值放在文件之前。
    • raul 你的 cmets 救了我。 @mscdex 请在您的回答中更新此内容
    • @mscdex 我的意思是 raul 的评论,“我必须更改我调用的顺序”,这很重要,否则我无法访问通过 api 请求发送的字段,文件字段应该成为 dict 中的最后一个,至少在我测试的 POSTMAN 中
    • 谢谢@Raul 只有 upload.any() 没关系。这甚至适用于upload.single('<fieldName>')upload.fileds([{name: '<fieldName>'}])。实际原因是,附加在之前文件附件的字段将只能访问。
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2016-03-23
    相关资源
    最近更新 更多