Zapier无需本地存储直接下载并上传图片的实现问题求助
流传输上传修复方案
你的核心需求是全程流传输、不落地存储文件,现有代码的问题集中在4个点:
makeDownloadStream没有返回Promise实例,导致await makeDownloadStream()实际拿到的是undefined,无法正常获取下载流- 手动拼接
multipart/form-data的请求头容易出现边界值不匹配的问题,form-data库本身支持直接生成完整的请求头配置 - 调用form.append添加文件流时缺少文件名和MIME类型声明,接收端会无法正确识别文件字段
- 原生http模块在Zapier运行环境中可能受网络代理、权限规则限制,优先使用Zapier官方提供的
z.request完成下载请求更稳定
修正后可运行代码
let FormData = require('form-data'); // 基于Zapier官方请求方法实现流下载,适配平台环境 const makeDownloadStream = async (z, url) => { return z.request({ url: url, method: 'GET', raw: true // 关键配置:返回原生响应流,不自动解析内容到内存/磁盘 }); }; const addAttachment = async (z, bundle) => { const form = new FormData(); // 下载图片获取响应流 const downloadResponse = await makeDownloadStream(z, bundle.inputData.attachment); // 追加文件字段,补充文件名和内容类型,保证接收端正常识别 form.append( `field_${bundle.inputData.field_id}`, downloadResponse.body, { filename: `attachment_${Date.now()}.${downloadResponse.headers['content-type'].split('/')[1]}`, contentType: downloadResponse.headers['content-type'] } ); // 追加业务数据字段 const data = JSON.stringify({ type: "records", attributes: { form_id: bundle.inputData.form_id } }); form.append('data', data); // 发起上传请求 const uploadResponse = await z.request({ url: bundle.inputData.url, method: 'PUT', headers: { ...form.getHeaders() // 自动生成正确的multipart请求头,无需手动拼接边界值 }, body: form }); return uploadResponse.data; };
额外注意事项
- 全程走流传输,不会将图片写入本地磁盘,符合你的不落地存储需求
- 如果目标接口要求POST请求,将上传配置中的
method参数从PUT改为POST即可 - 大文件上传时可以在请求配置中添加
timeout参数,避免触发Zapier默认30秒请求超时规则 - 部分低版本Zapier自定义集成环境默认关闭流操作权限,遇到权限报错可以到开发者后台调整集成的运行权限配置
内容的提问来源于stack exchange,提问作者Matthew Collins
相关产品推荐
相关产品推荐

