我想将文件从客户端上传到api。 但是,在保存之前必须对文件进行优化, 我开发了一个http服务器来完成这项工作, 我只是使用读取流发送和发布请求,服务器会优化文件。
我要执行的步骤是:
问题来自API:
当我发送这样的本地文件时,交互完美地起作用:
const form = new FormData();
form.append('file', fs.createReadStream('./test/audios/test.mp3'));
const file = await new Promise<Buffer>((resolve, reject) => {
const data = [];
form.submit({
host: [SERVER],
port: [PORT],
method: 'post',
path: '/',
headers: form.getHeaders(),
}, (err, res) => {
res.on('data', (buffer) => {
resolve(buffer);
});
});
});
在这种情况下,一切正常。 但是,我需要做的是将传入流传输到OptimizationServer 。 所以,我替换了行
form.append('file', fs.createReadStream('./test/audios/test.mp3'));
form.append('file', await inputFile.createReadStream());
在这种情况下,OptimizationServer会捕获错误:
Error: Part terminated early due to unexpected end of multipart data
Emitted 'error' event on FileStream instance at:
[...] \node_modules\dicer\lib\Dicer.js:65:36
传入流与fs.createReadStream之间确实存在差异。 我已经打印了这些流进行比较:
fs.writeFileSync('./tmp/normalStream.json', JSON.stringify(fs.createReadStream('./test/audios/test.mp3')));
fs.writeFileSync('./tmp/incomingStream.json', JSON.stringify(await audioInput.file.createReadStream()));
主要区别是incomingStream
获得属性_writeStream
而不是normalStream
。
有人可以通过http请求传输普通流吗?