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

Posted

技术标签:

【中文标题】如何从字符串创建文件并通过 FormData 发送【英文标题】:How to create a file from string and send it via FormData 【发布时间】:2021-01-04 08:57:00 【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

【参考方案1】:

嗯,问题是缓冲区比表单数据少。

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

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

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

【讨论】:

它不适用于 pdf。你有什么解决办法吗? pdf的缓冲区数据在另一端创建空pdf。 您是否也从字符串创建缓冲区? 我正在使用 busboy。它读取接收到的文件内容,然后我尝试附加表单数据以发送另一个 api 端点。 Busboy 读取收到的 pdf 文件的字节数比原始 pdf 文件多。这是屏幕截图的链接。你对此有什么想法吗? im.ge/i/QSWxNp 我正在使用 netlify 功能。见->answers.netlify.com/t/…

以上是关于如何从字符串创建文件并通过 FormData 发送的主要内容,如果未能解决你的问题,请参考以下文章

ColdFusion无法读取Ajax发送的FormData

将数组附加到 FormData 并通过 AJAX 发送

如何使用 FormData 发送文件数组?

如何在 Flask 中接受通过 ajax 发送的 FormData?

如何通过 jquery ajax 与 FormData 一起发送 AntiForgeryToken (CSRF)

创建与 FormData 一起使用的可读流