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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:54:06