首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有方法可以使用HTTP请求从Salesforce上传10 MB以上的文件到Dropbox?

有没有方法可以使用HTTP请求从Salesforce上传10 MB以上的文件到Dropbox?
EN

Stack Overflow用户
提问于 2020-07-31 03:54:08
回答 2查看 2.1K关注 0票数 1

下面的代码非常适合10 MB,但是当我试图上传超过20 MB的文件时,它会抛出一个错误。

代码语言:javascript
复制
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时抛出堆大小错误。

EN

回答 2

Stack Overflow用户

发布于 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的其他部分集成,当前的用户将悄悄地登录.

票数 0
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63185542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档