1

我想将一个小图像从一台服务器移动到另一台服务器(两个运行节点)。当我搜索时,我还没有找到足够的东西。帖子仍未得到答复。

当我开始试验时,我在第一台服务器上写了以下内容:

app.post("/move_img", function(req, res) {
    console.log("post handled");
    fs.readFile(__dirname + "/img_to_move.jpg", function(err, data) {
        if (err) throw err;
        console.log(data);
        needle.post(server2 + "/post_img", {
           data: data,
           name : "test.jpg"
        }, function(result) {
            console.log(result);
            res.send("ok");
        });
    });  
});

这部分似乎正在工作,因为我可以在同一服务器中写入数据(使用 fs.writeFile)重新创建 img。

现在,当我试图在另一台服务器上处理帖子时,我遇到了问题。

服务器2:

app.post('/post_img', [ multer({ dest: './uploads/images'}), function(req, res) {

    console.log("body ",req.body) // form fields
    console.log("files ",req.files) // form files
    res.send("got it");
}]);

这样我在文件中得到一个空对象,在正文中得到以下内容: { 'headers[Content-Type]': 'application/x-www-form-urlencoded', 'headers[Content-Length]': '45009' }

我想我可以使用 busboy 作为替代方案,但我无法让它工作。任何建议,教程都将受到欢迎。

4

3 回答 3

1

我使用以下代码解决了我的问题,

server1(使用针):

app.post("/move_img", function(req, res) {
    console.log("post handled")

    var data = {
        image:{
        file: __dirname + "/img_to_move.jpg",
        content_type: "image/jpeg"}
    }

    needle.post(server2 + "/post_img", data, {
        multipart: true
    }, function(err,result) {
        console.log("result", result.body);
    });
})

服务器 2:

app.use('/post_img',multer({
    dest: '.uploads/images',
    rename: function(fieldname, filename) {
        return filename;
    },
    onFileUploadStart: function(file) {
        console.log(file.originalname + ' is starting ...')
    },
    onFileUploadComplete: function(file) {
        console.log(file.fieldname + ' uploaded to  ' + file.path)
    }
}));

app.post('/post_img', function(req, res) {

    console.log(req.files);
    res.send("File uploaded.");

});

服务器 1 的替代方案如下(使用表单数据模块):

var form = new FormData();
form.append('name', 'imgTest.jpg');
form.append('my_file', fs.createReadStream(__dirname + "/img_to_move.jpg"));

form.submit(frontend + "/post_img", function(err, result) {
    // res – response object (http.IncomingMessage)  //
    console.log(result);
});
于 2015-05-21T13:51:14.117 回答
0

我只需使用函数readFile()从第一台服务器读取您的文件,然后使用函数writeFile()将其写入另一台服务器。

在这里,您可以看到在我的一台服务器中使用这两种功能。

于 2015-05-20T12:45:59.593 回答
0
'use strict';

const express   = require('express');
const multer= require('multer');
const concat = require('concat-stream');
const request = require('request');

const router = express.Router();

function HttpRelay (opts) {}


HttpRelay.prototype._handleFile = function _handleFile (req, file, cb) {
    file.stream.pipe(concat({ encoding: 'buffer' }, function (data) {
        const r = request.post('/Endpoint you want to upload file', function (err, resp, body) {

            if (err) return cb(err);
            req.relayresponse=body;
            cb(null, {});
        });

        const form = r.form();
        form.append('uploaded_file', data, {
            filename: file.originalname,
            contentType: file.mimetype
        });
    }))
};

HttpRelay.prototype._removeFile = function _removeFile (req, file, cb) {
    console.log('hello');
    cb(null);
};

const relayUpload = multer({ storage: new HttpRelay() }).any();

router.post('/uploadMsgFile', function(req, res) {
    relayUpload(req, res, function(err) {

        res.send(req.relayresponse);

    });
});

module.exports = router;

请参阅 multer 为您解决所有问题。你只需要确保你没有使用中间件,而是使用 multer 在你的节点起点上传文件。希望它也对你有用。

于 2020-04-05T05:43:58.923 回答