【问题标题】:File upload populating req.body but not req.file文件上传填充 req.body 但不填充 req.file
【发布时间】:2019-02-10 03:20:32
【问题描述】:

我已经使用 multer 和 express 创建了一个文件上传 API,它可以通过 POSTMAN 正常工作,但是当我尝试使用另一个文件上传 API 调用相同的 api 时,它不起作用:

我的代码如下在http://localhost:7022/nuxeo/upload上运行:

module.exports.upload = function (req, res, next) {
    var path = req.body.path
    var uploadFile = req.file; //get uploaded file
    var stream = streamifier.createReadStream(req.file.buffer) //create a stream from file buffer
    var blob = new Nuxeo.Blob({   //create a blob from file stream
        content: stream,
        name: uploadFile.originalname,
        mimeType: uploadFile.mimetype,
        size: uploadFile.size
    });
    var batch = nuxeo.batchUpload();

在上面的代码中,当我通过邮递员调用 API 时,我的 req.file 被填充。

但是使用下面的代码调用上面的 API 不会填充第一个 API 的 req.file,它是未定义的。我也尝试过使用 form-data npm 模块,但没有任何运气:

module.exports.attach = function(req,res,next){
    var uploadfile = req.file  //file is populated here
    formData = { 'file' : uploadfile, 'path' : '/FCA/DT/clause32a'}
    var opts = {
        url: "http://localhost:7022/nuxeo/upload",
        headers: { 'enctype':  'multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' },
        json: true,
        body: formData
    };
    request.post(opts,function(err,response,body){
        console.log(body)
    })
}

【问题讨论】:

  • 如果它与邮递员一起工作,服务器端应该可以正常工作。您可以发布客户端代码或html
  • 第二个 API 就像一个客户端,我在第二个 API 的 req.file 中接收上传的文件,该文件应该将此 req.file 发送到第一个 API
  • 我正在尝试做这样的事情:stackoverflow.com/questions/46975590/…

标签: javascript node.js express multer


【解决方案1】:
module.exports.attach = function(req,res,next){
    var uploadfile = req.file  //file is populated here
    var fs = require('fs');
var request = require('request');
request.post({
    url: <URL>,
    formData: {
        file: fs.createReadStream(<FILE_PATH>),
        filetype: <FILE_TYPE>,
        filename: <FILE_NAME>,
        title: <FILE_TITLE>,
    },
}, function(error, response, body) {
    console.log(body);
});

}

【讨论】:

  • 我可以把 req.file 放在 formData 的文件属性中吗?我通过 multer 将文件保存在内存中,它只能通过 req.file 访问。在做 fs.createReadStream(req.file) 我得到一个 TypeError :路径必须是一个字符串或缓冲区。另外,req.file 有一个缓冲区属性,我可以用它做任何事情吗?
  • 是的,您必须指定文件的路径,请阅读此处了解更多详细信息npmjs.com/package/…
  • 我正在尝试做这样的事情:stackoverflow.com/questions/46975590/…
  • 我想这正是你要找的stackoverflow.com/questions/25344879/…
【解决方案2】:

我在这篇文章的帮助下解决了这个问题:how to upload file saved in memory by multer to another API

var stream = require('stream')

const { Duplex } = stream;
function bufferToStream(buffer) {
   const duplexStream = new Duplex();
   duplexStream.push(buffer);
   duplexStream.push(null);
   return duplexStream;
}

request.post({
       headers: { 'enctype': 'multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' },
       url: "http://localhost:7022/nuxeo/upload",
            formData: {
                file: {
                    value: bufferToStream(req.file.buffer),
                    options: {
                        filename: req.file.originalname,
                        contentType: req.file.mimetype,
                        knownLength: req.file.size
                    }
                },
                path: '/FCA/DT/clause32a'
            }
        }, function (error, response, body) {
            if (error) { return next(error) 
            res.send(JSON.parse(body))
        })

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 2020-10-02
    • 2019-07-31
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多