You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Salesforce Apex发送form-data失败:调用Zalo API报文件不存在错误

错误原因分析
  • Blob编码错误:在Salesforce中直接将Blob类型的文件数据拼接到字符串里时,系统会自动把二进制内容转为Base64编码,但Zalo文件上传API需要原始二进制格式的文件内容,这就导致上传的内容并非真实文件数据,API无法识别,返回"File not exist!"。
  • 请求体构建方式错误:手动拼接multipart/form-data格式的字符串,无法正确处理文本头部与二进制文件的边界,容易出现格式混乱,导致API解析不出有效文件字段。
  • 冗余字段干扰:代码中添加的field1字段没有设置内容,可能干扰API的表单解析逻辑,无法正确定位到file字段的内容。
解决办法

1. 正确构建Multipart请求体(用Blob合并)

Salesforce的HttpRequest支持通过setBodyAsBlob设置二进制请求体,我们需要把multipart的各个部分(边界、字段头部、文件二进制)合并为完整Blob,避免编码错误。修改后的代码如下:

String fileId = '069HE0000010ZurYAE'; // contentDocumentId
String fileName = 'file-sample_150kB.pdf';
ContentVersion contentVersion = [SELECT Id, ContentSize, Title, ContentDocumentId, VersionData FROM ContentVersion WHERE ContentDocumentId = :fileId LIMIT 1];
Blob fileData = contentVersion.VersionData;

String boundary = '----MyBoundary';
// 构建各部分Blob
Blob boundaryPrefix = Blob.valueOf('--' + boundary + '\r\n');
Blob fileHeader = Blob.valueOf(
    'Content-Disposition: form-data; name="file"; filename="' + fileName + '"\r\n' +
    'Content-Type: application/octet-stream\r\n\r\n'
);
Blob boundarySuffix = Blob.valueOf('\r\n--' + boundary + '--\r\n');

// 合并所有Blob部分(若Zalo要求field1字段,可添加对应Blob并取消下方注释)
Blob requestBodyBlob = boundaryPrefix 
    // + Blob.valueOf('Content-Disposition: form-data; name="field1"\r\n\r\n你的字段内容\r\n')
    + fileHeader 
    + fileData 
    + boundarySuffix;

HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setEndpoint('https://openapi.zalo.me/v2.0/oa/upload/file');
req.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
req.setHeader('access_token', '<access_token_here>');
req.setBodyAsBlob(requestBodyBlob); // 使用setBodyAsBlob替代setBody

Http h = new Http();
HttpResponse response = h.send(req);

2. 验证API参数合规性

  • 确认access_token拥有文件上传权限且未过期。
  • 核对Zalo API文档,确认是否需要field1这类必填字段,若需要则补充对应内容,否则直接移除该字段。
  • 检查文件名fileName是否包含特殊字符,避免因格式问题导致解析失败。

3. 调试验证

  • 打印contentVersion.ContentSize,确认获取到的文件数据大小正常,确保查询到的ContentVersion是有效记录。
  • 小文件可临时将requestBodyBlob转为字符串,检查multipart格式是否正确,边界是否完整闭合。

内容的提问来源于stack exchange,提问作者Aman Bhatia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:35:06