使用Fastify-multipart通过多部分表单向Shopify上传文件遇问题
解决Fastify v3 + fastify-multipart v5转传文件到Shopify的FormData错误问题
问题原因
Fastify-multipart v5的saveRequestFiles返回的文件对象仅包含磁盘存储路径filepath,而非旧方案中的Buffer/File类型;parts则返回文件可读流,直接将这些对象追加到FormData会触发「未使用Blob」的错误。
方案一:读取本地文件转Blob/Buffer后追加
通过fs模块读取磁盘上的文件内容,转换为Buffer或Blob后再添加到FormData:
const fs = require('fs').promises; const FormData = require('form-data'); // 接收客户端上传的文件并保存到磁盘 const uploadedFiles = await fastify.saveRequestFiles(); const formData = new FormData(); for (const file of uploadedFiles) { // 读取文件内容为Buffer const fileBuffer = await fs.readFile(file.filepath); // 转换为Blob(Node.js 16.14+支持原生Blob,低版本可使用blob-polyfill) const fileBlob = new Blob([fileBuffer], { type: file.mimetype }); // 追加到FormData,指定文件名和类型 formData.append('file', fileBlob, file.filename); } // 发起转传请求到Shopify const shopifyResponse = await fetch('https://your-shop.myshopify.com/admin/api/2024-07/products/{product_id}/media.json', { method: 'POST', headers: { ...formData.getHeaders(), 'X-Shopify-Access-Token': 'your-access-token' }, body: formData });
方案二:直接使用可读流转传(无磁盘写入,更高效)
跳过磁盘存储步骤,直接通过parts获取文件可读流,添加到FormData(需使用支持可读流的form-data库):
const FormData = require('form-data'); const formData = new FormData(); // 获取请求中的文件流 const parts = await fastify.parts(); for await (const part of parts) { // 过滤出文件类型的请求部分 if (part.file) { // 直接将可读流追加到FormData formData.append('file', part.file, { filename: part.filename, contentType: part.mimetype }); } } // 发起转传请求到Shopify const shopifyResponse = await fetch('https://your-shop.myshopify.com/admin/api/2024-07/products/{product_id}/media.json', { method: 'POST', headers: { ...formData.getHeaders(), 'X-Shopify-Access-Token': 'your-access-token' }, body: formData });
注意事项
- 确保使用
form-data库(Node.js环境)而非浏览器原生FormData,前者支持Buffer和可读流的追加操作。 - 验证Shopify接口的参数要求,比如字段名是否为
file、API版本是否正确。 - 若Node.js版本低于16.14,需安装
blob-polyfill来支持Blob构造函数。
内容的提问来源于stack exchange,提问作者محمد خير الخلق
相关产品推荐
相关产品推荐

