如何从字符串创建文件并通过 FormData 发送

JKa*_*fer 3 buffer fs node.js node-streams

我有一个字符串形式的svg 。我想将该字符串转换为文件并将其发送FormData到另一个 API。

我找到了一种工作方式,但包括在本地创建一个文件(使用fs),然后readStream从刚刚创建的文件创建一个。处理许多文件的速度非常慢,并且大多数时候都会导致超时。

fs.writeFile('file.svg', svgString, async () => {
            const fr = fs.createReadStream('file.svg');
            const formData = new FormData();
            formData.append('media', fr);

            const response = await Axios.post(route, formData, {...}
            });
        });
Run Code Online (Sandbox Code Playgroud)

这是我使用 Buffer 和 Readable 的(失败的)方法:

// Create readable from svg string
const b = Buffer.from(svgString, 'utf-8');
const r = Readable.from(b);

const formData = new FormData();
formData.append('media', fr);

const response = await Axios.post(route, formData, {...});
Run Code Online (Sandbox Code Playgroud)

此方法给出的结果与第一种方法不同。然后我从外部 API 收到错误。

问题是如何获得与第一种方法相同的结果,而不将本地文件写入磁盘。

提前致谢!

JKa*_*fer 5

嗯,问题不在于缓冲区,而在于表单数据。

API 要求数据有一个文件名,当使用以下命令从实际文件读取时,它会自动获得该文件名fs.createReadStream('file.svg');

因此,在创建缓冲区时我必须手动添加它。所以最终的工作解决方案是:

const svgBuffer = Buffer.from(svgString);
const formData = new FormData();
formData.append('media', svgBuffer, {
    filename: 'content.svg'
});
Run Code Online (Sandbox Code Playgroud)