【问题标题】:Forward uploaded file in POST request - express在 POST 请求中转发上传的文件 - 快递
【发布时间】:2017-04-17 20:46:51
【问题描述】:

我希望我的网络服务器发布一个文件,然后在一个 POST 请求中将它转发到另一台服务器。

const pug = require('pug');
var cloudinary = require('cloudinary');
var express = require('express');
var multer  = require('multer');
var upload = multer({ dest: 'uploads/' });
var request = require('request');
var bodyParser = require('body-parser');
var JSON = require('JSON');
var https = require('https');
var fs = require('fs');
var request = require('request');
var upload = multer({ dest: 'uploads/' });
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; // We are OK with self-signed

var serverURL = 'https://ec2-54-202-139-197.us-west-2.compute.amazonaws.com:443';

var app = express();
var parser = bodyParser.raw();
var result = null;
app.use(parser);

app.set('view engine', 'pug');

app.get('/',upload.single('avatar'), function (req, res) {
    return res.render('index.pug', {results: [], result_pics: {}});
});

app.post('/makeRequest*', upload.single('uploadPicture'), function(req, res) {
    console.log("Files:");
    console.log(req.file);
    console.log(req.body);

    var r = request.post({url: serverURL, headers: {'User-Agent': 'Client Webserver'}}, function (err, httpResponse, body) {
        console.log('got response');
        console.log(err);
        console.log(body);
        body = JSON.parse(body);
        content = body['content'];
        console.log(content);
        message_type = body.message_type;
        result_pics = [];
        result = [];
        if (message_type == "error") {
            result = ["ERROR: " + body.content];
        }
        else if (message_type == "student created") {
            result = ["Student created."];
        }
        else if (message_type == "student deleted") {
            result = ["Student deleted."]
        }
        else if (message_type == "picture inserted") {
            result = ["Picture inserted."];
        }
        else if (message_type == "viewed pictures") {
            pics = body.pictures;
            for (key in pics) {
                result_pics.push(cloudinary.image(pics[key], {width: 300, height: 200, crop: "crop"}));
            }
        }
        else if (message_type == "listing information") {
            student_table = body.content["student_table"];
            student_to_pic_table = body.content["student_to_pic_table"];

            for (i in student_table) {
                student = student_table[i];
                result.push("Student ID: " + student["student_id"] + " Nickname: " + student["nickname"]);
            }
            for (i in student_to_pic_table) {
                student_pic = student_to_pic_table[i];
                result.push("Student ID: " + student_pic["student_id"] + " Pic ID: " + student_pic["image_id"]);
            }
        }
        else {
            result = ["ERROR: returned message is not of valid type"];
        }

        res.render('index.pug', {results: result, result_pics: result_pics});
        res.end();
    });
    var form = r.form();
    if (req.file) {
        form.append('uploadPicture', req.file);
    }
    form.append('content', JSON.stringify(req.body));


});

app.listen(3000, function() { console.log('listening'); });

所以,当 req.file 为真时,我得到以下错误:

TypeError: source.on is not a function
    at Function.DelayedStream.create (/home/daniel/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
    at FormData.CombinedStream.append (/home/daniel/node_modules/combined-stream/lib/combined_stream.js:43:37)
    at FormData.append (/home/daniel/node_modules/form-data/lib/form_data.js:68:3)
    at /home/daniel/WebstormProjects/CloudA3 Client/CloudA3/skrpt.js:95:18
    at Layer.handle [as handle_request] (/home/daniel/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/daniel/node_modules/express/lib/router/route.js:131:13)
    at Immediate.<anonymous> (/home/daniel/node_modules/multer/lib/make-middleware.js:53:37)
    at Immediate.immediate._onImmediate (timers.js:440:18)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
got response
{ [Error: socket hang up] code: 'ECONNRESET' }

我猜我需要将 req.file 转换为其他类型才能传输它,但是我在任何地方都找不到有关此的任何信息,也没有任何示例,也找不到 req.file 的类型甚至是!

我该如何解决这个问题?

【问题讨论】:

    标签: node.js express request multipartform-data


    【解决方案1】:

    由于您使用的是multerDiskStorage,因此req.file objectreq.file.path 属性中具有本地存储文件内容的完整路径。您可以使用它通过fs.createReadStream() 创建一个stream.Readable 并将其直接传递给表单。你可以很容易地做这样的事情。

    form.append('uploadPicture', fs.createReadStream(req.file.path))

    【讨论】:

      【解决方案2】:

      我正在通过后端将文件上传到另一台服务器。我目前将multerMemoryStoragereq.file.buffer 一起用于表单数据,其中我还必须包含文件名,这也导致内容类型设置正确。

      form.append('uploadPicture', req.file.buffer, { filename: req.file.originalname });
      

      也可以从请求中复制内容类型:

      form.append('uploadPicture', req.file.buffer, { contentType: req.file.mimetype, filename: req.file.originalname });
      

      我预计该服务的使用率较低,所以对我来说 MemoryStorage 应该没问题,但 DiskStorage 可能更适合您的用例。

      【讨论】:

      • 如果执行此操作后仍然无法正常工作,请检查标题
      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2014-10-10
      • 2018-06-08
      相关资源
      最近更新 更多