【问题标题】:How may I upload file with formData to node js with express?如何使用 express 将带有 formData 的文件上传到节点 js?
【发布时间】:2019-10-14 23:33:27
【问题描述】:

我想把文件和一些数据上传到服务器上,如果我是对的,我需要将文件和所有数据传递到formData中,并在服务器端解析。

我也在使用 Multer 解析正文并将文件保存在服务器上,但我不知道如何从我的 formData 中获取我的文本数据,因为 Multer 使用我的数据从没有 formData 的只读文件中获取表格。

如何在 Multer 中获取所有数据或在没有 Multer 的情况下获取表单数据?

前端

let file = file[0];
//some file from input

let data = {
  name: 'Jhon',
  job: 'Engener',
  time: 12
}
let formData = new FormData();

formData.append('formData', JSON.stringy(data))

axios.post('someURL', formData);

后端

const multer = require('multer');
const fs = require('fs');

let storage = multer.diskStorage({
  destanation: (req, file, callback) => {
      callback(null, '/files')
  },
  
  filename: (req, file, callback) => {
    callback(null, 'newFile');
  }
});

let upload = multer({storage)};
 
 
api.post('/', upload.any(), (req, res) => {
  
});

【问题讨论】:

  • 老实说,这个问题太宽泛了。 Multer 确实有文档。没有minimal reproducible example,我们无法判断您做错了什么。

标签: javascript node.js express


【解决方案1】:

如果我理解正确,代码应该在同一操作中处理上传和获取一些发布的数据。前段时间我写了这段运行良好的sn-p代码,也许有帮助:

exports.myPostFunction = function (req, res) {
    var multer = require('multer');

    var path = require('path');
    var storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, process.env.UPLOAD_FOLDER);
        },
        filename: function (req, file, cb) {
            cb(null, path.extname(file.originalname));
        }
    });

    // Treat posted file
    var upload = multer({ storage: storage }).fields([
        { name: 'myImage', maxCount: 1 }, 
    ]);

    upload(req, res, function(err) {
        if (err) {
            // ...
        } 

        // Get posted data:
        var obj = { 
            myField1: req.body.myField1,
            myField2: req.body.myField2
        };

        // ...
     });
};

在前端:

var formData = new FormData();
formData.append("myField1", data.myField1);
formData.append("myField2", data.myField2);
formData.append("myImage", data.image[0]); // myInputFile.files[0]

$.ajax({
    url: 'someURL',
    type: 'put',
    processData: false,
    data: formData,
    success: function(data) {}
});

【讨论】:

  • 那个函数在路由器回调中使用并传递req,res作为参数?
  • @Drop,是的!将req, res 传递给upload 函数。我这样做是因为 multer 首先保存文件,然后将剩余数据写入req
  • 嗨,我做了类似的事情,但它现在不起作用。我有 router.post('/withimage', alertWithImagePost ); alertWithImagePost 就像你的 myPostFunction 一样。好像它从来没有通过目标和文件名的函数(磁盘存储)我错过了什么吗?
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多