问题描述
下面的代码可以完美地处理10 MB的文件,但当我尝试上载超过20 MB的文件时,它会抛出错误。
private string TOKEN = 'access_token_of_dropbox_app';
string folderPathWithFileName;
for(ContentVersion contentVersionRec : [SELECT PathOnClient, VersionData
FROM contentversion
WHERE contentdocumentId IN : contentDocumentIdSet]){
folderPathWithFileName = '/Root/'+PathOnClient;//PathOnClient contains file name with extension
//like imagefile.png
system.debug('###folderPathWithFileName=>'+folderPathWithFileName);
Http http = new Http();
HttpRequest httpReq = new HttpRequest();
httpReq.setEndpoint('https://content.dropboxapi.com/2/files/upload');
httpReq.setMethod('POST');
httpReq.setHeader('Authorization','Bearer ' + TOKEN);
httpReq.setHeader('Content-Type','application/octet-stream');
httpReq.setHeader('Dropbox-API-Arg','{"path":"'+folderPath+'","mode":{".tag":"add"}}');
httpReq.setBodyAsBlob(contentVersionRec.VersionData);
HttpResponse httpResponse = http.send(httpReq);
System.debug('res###' + httpResponse);
System.debug('res.getBody()###'+httpResponse.getBody());
if (httpResponse.getStatusCode() == 200) {
System.debug('##Congratulations File Uploaded successfully :) =>'+httpResponse.getBody());
}else{
//Handle code here when file not uploaded.
}
}
尝试上载20 MB文件时抛出错误:
System.CalloutException:超过最大大小限制12000000,请求大小为12001280
上述代码在可排队(异步)顶点中运行,且可排队顶点从触发器触发。所以我能够成功上传10MB的文件。我也知道ASYNC PEACT中的堆大小为12MB的限制。 但想知道有没有办法将文件从Salesforce上传到Dropbox超过10MB。我希望将最多100 MB的文件从APACH HTTP请求上载到Dropbox。注意:Dropbox API还允许我们按块上传数据,这意味着我们可以使用APEX HTTP请求将数据按块发送到Dropbox。但挑战是,在首先创建块时,我们需要将BLOB数据转换为字符串或Base64以创建多个块。它在7-8 MB的情况下可以很好地工作,但当我们有超过20 MB的空间时,它在将BLOB转换为字符串或Base64时也会抛出堆大小错误。
推荐答案
好...这也是我们正在努力解决的问题。克服这些限制的答案是基于体系结构。如果您正在使用LWC或AURA组件将文件上传/下载到Dropbox API,您可以使用Java脚本而不是APEX。在这种情况下,您必须与CSP和CORS的限制和问题作斗争。
在浏览器内的客户端上执行Java脚本,浏览器受RAM使用的限制。我认为在几乎所有情况下,客户端资源都远远大于12MB的RAM。
我不知道APEX中的任何流概念,因此任何内容都必须符合堆大小限制。
一旦Salesforce启用Evergreen,您就可以使用Evergreen来克服这一限制,Evergreen不是在Salesforce平台内运行,而是在Heroku平台内运行(我猜)。此平台按需交付资源,应具有更高的限制。
https://developer.salesforce.com/blogs/2019/11/introducing-salesforce-evergreen