下面的代码非常适合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
上面的代码运行在队列(异步)顶点中,而可排队的顶点从触发器中触发。所以我可以上传10 MB的文件成功。我还意识到ASYNC顶点中堆大小为12 MB的限制。但是想知道是否有方法将文件从salesforce上传到dropbox超过10 MB。我想上传最大100 MB文件从顶点HTTP请求到dropbox。
注意: dropbox还允许我们以块方式上传数据,这意味着我们可以使用顶级HTTP请求将数据以块的形式发送到dropbox。但挑战是,在首先生成块时,我们需要将blob数据转换为string或base64来生成多个块。它可以在7-8MB的情况下正常工作,但是当我们还有20 MB时,它也会在将blob转换为string或base64时抛出堆大小错误。
发布于 2020-07-31 08:13:55
有趣的问题!也试着在https://salesforce.stackexchange.com/上询问
看看是否可以使用dropbox插件https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000000prqLEAQ。它可能附带了一些Apex或JavaScript内置程序,您可以调用,您必须检查包中标记为global和/或直接联系Dropbox的方法。
或者你有没有考虑过另一个存储提供商?谷歌硬盘( Google )、谷歌( SharePoint )、OneDrive & Box都有内置支持,名为文件连接。这是有点俗气和5岁,但体面:https://www.youtube.com/watch?v=aG3m3zP00KQ
如果不能做到这一点--在纯粹的巅峰时期,你所能做的并不多,这是一个很难的限制。您可以通过“下载”文件到JavaScript,在那里分块,或者直接发送块到Dropbox或通过Apex服务(如果您想保留API密钥服务器端)来实现它。
你可以倒流。Dropbox能拉文件吗?还是只按?如果没有-你能发送一个通知到另一个应用程序(比如托管在Heroku上),它会登录到SF (或者你可以传递当前用户的会话id),它会通过SF标准API提取文档,然后发送。我想你是在为带宽付费,但它可以工作得很好,特别是如果你把这个应用程序作为一个“画布”,这样它就能很好地与Salesforce的其他部分集成,当前的用户将悄悄地登录.
发布于 2021-09-21 08:15:39
好吧..。这也是我们努力解决的问题。克服这些限制的答案是基于体系结构的。如果您使用LWC或AURA组件将文件上载/下载到dropbox,则可以使用Javascript而不是APEX。在这种情况下,您必须与CSP和CORS的局限性和问题进行斗争。
Javascript是在浏览器内部的客户端执行的,并且浏览器对RAM使用的限制。我认为在几乎每一种情况下,客户端资源都要比12 MB的RAM大得多。
我不知道在APEX内的任何流概念,所以任何内容都必须符合堆大小限制。
一旦Salesforce启用了Evergreen,您就可以使用Evergreen克服这个限制,它不是在Salesforce平台内运行,而是在heroku平台中运行(我猜)。该平台按需提供资源,应该有更高的限制。
https://developer.salesforce.com/blogs/2019/11/introducing-salesforce-evergreen
https://stackoverflow.com/questions/63185542
复制相似问题