【问题标题】:Node JS upload binary file to another serverNode JS 将二进制文件上传到另一台服务器
【发布时间】:2016-06-25 16:20:56
【问题描述】:

我有一个音频文件,我将它发布到服务器进行翻译。我设法在邮递员中创建了一个请求,但我不知道如何将文件写入此服务器。以下是我目前得到的代码:

var http = require("https");

var options = {}

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
   });
});

options{} 填充了方法/主机名/端口。在邮递员中,我添加了“二进制”文件,但我无法弄清楚如何将文件写入 Node JS 中的请求。

【问题讨论】:

    标签: javascript node.js binaryfiles


    【解决方案1】:

    一种无需太多工作即可轻松融入当前程序的解决方案是使用 npm 上的 form-data 模块。

    表单数据模块简化了节点中的多部分请求。下面是一个简单的使用示例。

    var http = require("https");
    var FormData = require('form-data');
    var fs = require('fs')
    
    var form = new FormData();
    form.append('my_field', fs.createReadStream('my_audio.file'));
    
    var options = {
      host: 'your.host',
      port: 443,
      method: 'POST',
      // IMPORTANT!
      headers: form.getHeaders()
    }
    
    var req = http.request(options, function (res) {
      var chunks = [];
    
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
    
      res.on("end", function () {
        var body = Buffer.concat(chunks);
        console.log(body.toString());
       });
    });
    
    // Pipe form to request
    form.pipe(req);
    

    在“真实世界”场景中,您可能希望进行更多的错误检查。此外,npm 上还有许多其他 http 客户端也使这个过程变得简单(请求模块使用 form-data BTW)。如果您有兴趣,请查看requestgot

    对于发送二进制请求,基本原理仍然相同,reqwritable stream。因此,您可以将pipe 数据写入流,或直接使用req.write(data) 写入。这是一个例子。

    var http = require('https');
    var fs = require('fs');
    
    var options = {
      // ...
      headers: {
        'Content-Type': 'application/octet-stream'
      }
    }
    
    var req = http.request(options, function (res) {
      var chunks = [];
    
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
    
      res.on("end", function () {
        var body = Buffer.concat(chunks);
        console.log(body.toString());
       });
    });
    
    
    var audioFile = fs.createReadStream('my_audio.file', { encoding: 'binary' });
    audioFile.pipe(req);
    

    请注意,如果您明确使用write 方法req.write(data),则必须调用req.end()。此外,您可能想查看 Node 的 Buffer (docs) 的编码选项。

    【讨论】:

    • 感谢您的帮助。不幸的是,我发布的服务器不接受表单数据,只接受二进制文件传输。
    • 对不起,我误会了。我编辑了答案,希望对您有所帮助。
    • 谢谢,这就是我的解决方案
    • 感谢“var body = Buffer.concat(chunks);”真的对我有用!
    【解决方案2】:

    你可以在 npm 上使用 request 包。

    从 npm 安装 request 模块: npm install request --save

    然后使用请求模块发送您的请求。

    请查看https://www.npmjs.com/package/request 了解有关实施的详细信息。

    【讨论】:

    • 举一个真实的例子。现在只是一条评论
    【解决方案3】:

    谢谢@undefined,你的回答对我很有帮助。

    我正在发布我的解决方案,该解决方案可以让我使用 axios 将文件发送到另一台服务器。忽略类型规范,我为我的项目启用了 Typescript。

    export const fileUpload: RequestHandler = async (req: Request, res: Response, next: NextFunction) => {
        const chunks: any[] = [];
        req.on('data', (chunk) => chunks.push(chunk));
        req.on('end', () => {
            const data = Buffer.concat(chunks);
            axios.put("ANOTHER_SERVER_URL", data).then((response) => {
                console.log('Success', response);
            }).catch(error => {            
                console.log('Failure', error);
            });
        });
        return res.status(200).json({});
    };
    

    谢谢,希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多