使用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
相关产品推荐
相关产品推荐

