我有一个音频文件,我将其发布到服务器进行翻译。我已设法在邮递员中创建请求,但我不知道如何将文件写入此服务器。下面是我到目前为止的代码:
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中将文件写入请求。
答案 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)。如果您有兴趣,请查看request和got。
为了发送二进制请求,基本面仍然相同,req
是writable 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()
。此外,您可能需要查看节点Buffer
(docs)的编码选项。
答案 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({});
};
谢谢,希望对您有所帮助!