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

问题描述

我有一个字符串形式的 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,{...}
            });
        });

这是我使用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,{...});

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

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

谢谢!

解决方法

好吧,问题出在缓冲区而不是表单数据上。

API要求数据具有文件名,当使用fs.createReadStream('file.svg');从实际文件中读取文件名时,它将自动具有该文件名。

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

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