繁体   English   中英

Node JS上传二进制文件到另一台服务器

[英]Node JS upload binary file to another server

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

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 中的请求。

一种无需太多工作即可轻松融入您当前程序的解决方案是使用 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 客户端也使这个过程变得简单(请求模块使用表单数据 BTW)。 查看请求,如果您有兴趣,就会得到

对于发送二进制请求,基本原理仍然相同, req可写流 因此,您可以将数据通过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 ) 的编码选项。

您可以在 npm 上使用请求包。

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

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

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

谢谢@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({});
};

谢谢,希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM