代码之家  ›  专栏  ›  技术社区  ›  Wolfdog

将文件从一个节点js服务器发送到另一个节点js服务器

  •  0
  • Wolfdog  · 技术社区  · 8 年前

    所以在第一台服务器上,我有如下路由:

    const express = require('express');
    const router = express.Router();
    const FormData = require('form-data');
    const fetch = require('node-fetch');
    const multer = require('multer');
    const storage = multer.memoryStorage();
    const upload = multer({ storage });
    
    router.post('/', upload.single('file'), async (req, res) => {
    
        const form = new FormData();
    
        form.append('folderId', req.body.folderId);
        form.append('file', req.file.buffer, req.file.filename);
    
        const result = await fetch('http://localhost:3003/users', { method: 'POST', body: form }).then(res => res.json());
        res.json(result);
    })
    

    请求文件

    其他服务器路由如下所示:

    const express = require('express');
    const router = express.Router();
    const multer = require('multer');
    const path = require('path');
    const putanja = path.join(__dirname, '../uploads/users');
    const storage = multer.diskStorage({
        destination: (req, file, cb) => {
            console.log('entered here?')
            if (!req.body.folderId) return cb({ message: 'no folderId' });
            if (!fs.existsSync(putanja + '/' + folderId)) fs.mkdirSync(putanja + '/' + folderId);
            cb(null, putanja + '/' + folderId);
        },
        filename: (req, file, cb) => cb(null, file.originalname)
    });
    const upload = multer({ storage });
    const fs = require('fs');
    
    
    router.post('/', upload.single('file'), async (req, res) => {
        console.log(req.body)
        console.log(req.file)
        res.json({ status: 'ok' })
    })
    

    所以在第二台服务器上,它甚至没有进入multer中间件,req.file总是被定义的,而且console.log('entered here?')从未被看到。看起来我不是以多部分形式传递数据?

    另外,第二台服务器在通过邮递员直接向其发送文件时也可以工作。

    那么我的问题是,我如何发送该文件?作为缓冲?流动Base64?我想我尝试了一切,甚至改变了 节点获取 到

    2 回复  |  直到 8 年前
        1
  •  1
  •   Sunil Patel    8 年前

    所以在第二台服务器上,它甚至没有进入multer中间件,req.file总是被定义的,而且console.log('entered here?')从未被看到。看起来我不是以多部分形式传递数据?

    还有一件事需要补充 内容类型

    添加 内容类型 到多部分/表单数据 或者,如果您不知道传递头:{ “内容类型”:未定义 }http将为您设置标头

        2
  •  0
  •   Lucas S.    8 年前

    您将请求发送到 /users http://localhost:3003/users )然而,您的第二台服务器期望在 /

    尝试更改其中一个以匹配另一个。

        3
  •  0
  •   Rashed Alam    6 年前
    '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) {
        console.log('hell0 proto');
        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;