有没有办法使用HTTP请求将超过10 MB的文件从Salesforce上传到Dropbox?

人气:156 发布:2022-10-16 标签: dropbox-api salesforce apex-code

问题描述

下面的代码可以完美地处理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

155