如何通过Salesforce Apex实现20MB以内大文件的上传操作
Salesforce Apex上传20MB大文件的可行方案及操作流程
首先明确前置限制:Salesforce同步Apex上下文的堆空间上限为6MB,异步Apex堆空间上限为12MB,因此无法直接在单步同步逻辑中处理20MB大小的文件,可参考以下三种落地性最高的方案:
方案1:自定义分块上传 + 异步Apex拼接
无需依赖标准API的封装逻辑,灵活性最高,可自定义校验、权限控制等额外逻辑。
操作流程
- 前端将20MB文件按单块不超过4.5MB的大小切片,预留足够堆空间余量,每块附带三个参数:文件唯一标识、当前块序号、总块数
- 前端调用
@AuraEnabled方法或自定义Apex REST接口上传单块,Apex端接收后将分块存入自定义临时对象FileChunk__c(需包含Blob类型的内容字段、序号字段、文件唯一标识字段) - 每块上传完成后校验已上传块数量,所有块上传完成后触发Queueable异步任务执行拼接逻辑
- 异步任务按序号读取所有分块,拼接为完整Blob后写入正式的
ContentVersion记录,最后删除临时分块数据
注意:如果文件大小超过12MB,拼接逻辑建议拆分为多步异步任务执行,避免超出异步Apex的堆空间限制;临时分块数据需配置定时删除任务,避免上传中断产生垃圾数据。
核心代码示例
接收分块的Aura接口:
@AuraEnabled public static String saveFileChunk(String fileIdentifier, Integer chunkIndex, Blob chunkContent, Integer totalChunks) { FileChunk__c chunk = new FileChunk__c(); chunk.FileIdentifier__c = fileIdentifier; chunk.ChunkIndex__c = chunkIndex; chunk.Content__c = chunkContent; chunk.TotalChunks__c = totalChunks; insert chunk; Integer uploadedCount = [SELECT COUNT() FROM FileChunk__c WHERE FileIdentifier__c = :fileIdentifier]; if(uploadedCount == totalChunks) { Id jobId = System.enqueueJob(new FileMergeJob(fileIdentifier)); return 'Merge started, job id: ' + jobId; } return 'Chunk saved, remaining chunks: ' + (totalChunks - uploadedCount); }
异步拼接Queueable类:
public class FileMergeJob implements Queueable { private String fileId; public FileMergeJob(String fileIdentifier) { this.fileId = fileIdentifier; } public void execute(QueueableContext context) { List<FileChunk__c> chunks = [SELECT Content__c FROM FileChunk__c WHERE FileIdentifier__c = :fileId ORDER BY ChunkIndex__c ASC]; Blob fullFile = Blob.valueOf(''); for(FileChunk__c chunk : chunks) { fullFile = Blob.join(new List<Blob>{fullFile, chunk.Content__c}); } ContentVersion cv = new ContentVersion(); cv.Title = 'Uploaded Large File'; cv.PathOnClient = 'large_file.bin'; cv.VersionData = fullFile; cv.Origin = 'H'; insert cv; delete chunks; } }
方案2:调用ConnectAPI分块上传
官方封装的原生文件上传能力,无需自行维护临时分块存储,稳定性最高。
操作流程
- Apex端调用
ConnectApi.ContentVersions.createContentVersionUploadSession方法创建上传会话,获取会话ID - 按单块最大4MB的大小拆分文件,循环调用
ConnectApi.ContentVersions.uploadContentVersionPart方法上传每个分块 - 所有分块上传完成后调用
ConnectApi.ContentVersions.completeContentVersionUploadSession方法关闭会话,系统会自动生成正式的ContentVersion记录
方案3:基于Bulk API v2.0上传
无需处理前端切片逻辑,适合后端服务直接生成大文件上传的场景。
操作流程
- Apex中调用Bulk API v2.0创建插入任务,指定操作对象为
ContentVersion - 将20MB文件拆分为不超过12MB的批次(适配Apex HTTP请求12MB的Payload限制),按Bulk API要求拼接为CSV格式,
VersionData列填写Base64编码的文件内容 - 发送HTTP请求上传CSV文件到Bulk API的批次端点,轮询任务状态直到上传完成,获取生成的文件记录ID
内容的提问来源于stack exchange,提问作者Ravi Shah
相关产品推荐
相关产品推荐

