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

时间:2016-06-25 16:20:57

标签: javascript node.js binaryfiles

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

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{}填充了方法/主机名/端口ofcourse。在邮递员中我添加"二进制"文件,但我无法弄清楚如何在Node JS中将文件写入请求。

3 个答案:

答案 0 :(得分: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客户端也可以轻松完成这个过程(请求模块使用表单数据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()。此外,您可能需要查看节点Bufferdocs)的编码选项。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

谢谢,希望对您有所帮助!