Apex代码通过Multipart FormData上传音频文件报错求助
解决Apex Multipart FormData上传音频时的ActionController::UnknownFormat错误
我来帮你排查这个问题——你遇到的ActionController::UnknownFormat错误,核心是你的Apex代码在构建Multipart FormData请求时忽略了几个关键细节,而Postman会自动处理这些,所以能正常运行。下面是具体的修复方案:
1. 别把文件路径当内容传!
你现在的代码里直接把F:\Test.mp3这个字符串拼进请求体里,服务端收到的是一串路径文本,根本不是音频的二进制数据,这肯定会导致解析失败。
Apex无法直接访问本地文件系统,你得先把音频文件上传到Salesforce的Static Resource或者Attachment中,再读取对应的Blob内容:
// 示例:从Static Resource读取音频Blob StaticResource audioResource = [SELECT Body FROM StaticResource WHERE Name = 'TestAudio']; Blob audioBlob = audioResource.Body;
2. 用规范的HTTP换行符
HTTP协议里的Multipart分隔要求用\r\n(CRLF),你代码里用的单纯换行符会导致服务端解析请求结构出错。
3. 重新构建正确的Multipart请求体
按照标准格式拼接请求体,把音频Blob正确插入到分隔块中:
// 生成随机的boundary(避免和内容冲突) String boundary = '----WebKitFormBoundary' + String.valueOf(Crypto.getRandomLong()); String contentTypeHeader = 'multipart/form-data; boundary=' + boundary; // 构建请求块的头部 String partHeader = '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="recording[s3_location]"; filename="abc.mp3"\r\n' + 'Content-Type: audio/mpeg\r\n\r\n'; // 构建请求块的尾部 String partFooter = '\r\n--' + boundary + '--'; // 拼接完整的请求体Blob:头部字符串转Blob + 音频Blob + 尾部字符串转Blob Blob requestBody = Blob.valueOf(partHeader) + audioBlob + Blob.valueOf(partFooter);
4. 正确配置请求头
发送请求时,必须把Content-Type设置为包含boundary的完整值,确保服务端能正确解析Multipart结构:
HttpRequest req = new HttpRequest(); req.setEndpoint('你的外部Web服务URL'); req.setMethod('POST'); req.setHeader('Content-Type', contentTypeHeader); // 用setBodyAsBlob而不是setBody,避免二进制内容乱码 req.setBodyAsBlob(requestBody); Http http = new Http(); HttpResponse res = http.send(req); // 打印调试信息 System.debug('响应状态码:' + res.getStatusCode()); System.debug('响应内容:' + res.getBody());
为什么Postman能正常运行?
Postman会自动帮你完成这些细节:
- 正确读取本地文件的二进制内容
- 自动生成符合规范的boundary和CRLF换行符
- 自动设置正确的
Content-Type请求头
而你的手动构建请求体时遗漏了这些,导致服务端无法识别请求格式,抛出ActionController::UnknownFormat错误。
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

