[英]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.