Salesforce 在 Blob Zip 文件中提取文件

Salesforce extract files within Blob Zip File

我正在 Salesforce 开发一个应用程序,我使用 HttpRequest 从外部服务器获得 zip file 表单。

我从服务器获取的文件是Blob,但我不知道如何处理它来提取我想要的文件。

这是代码

        HttpRequest req = new HttpRequest();

       /* Here i set the HttpRequest Attributes*/

        Http http = new Http();                
        HttpResponse response = http.send(req);

        Blob file = response.getBodyAsBlob();

        /*Now i need to access: file to extract the files i want*/

Salesforce 不支持 zip 文件解压。您必须在外部托管服务上执行此操作。

我终于找到了解决方案,这不是最好的解决方案,因为要解压缩文件我应该使用外部服务,但我 运行 没时间了,所以这些是我遵循的步骤:

1.为 zip 文件创建 StaticResource(我必须使用 Metadata Salesforce Api

2。通过使用 url 创建 PageReference 对象来提取所需的文件:`/resource/NameOfResource/NameOfFile

3。删除 StaticResource: 我创建它只是为了提取一些文件,所以我不再需要它了。

这是我从 This link

得到的第一点的示例代码
private static MetadataService.MetadataPort createService()
    { 
        MetadataService.MetadataPort service = new MetadataService.MetadataPort();
        service.SessionHeader = new MetadataService.SessionHeader_element();
        service.SessionHeader.sessionId = UserInfo.getSessionId();
        return service;     
    }    

MetadataService.MetadataPort service = createService(); 
MetadataService.StaticResource staticResource = new MetadataService.StaticResource();
staticResource.fullName = nameOfResource;
staticResource.contentType = 'application/zip';
staticResource.cacheControl = 'public';
staticResource.content = EncodingUtil.base64Encode(zipBlobFile);
List<MetadataService.SaveResult> results =  service.createMetadata( new MetadataService.Metadata[] { staticResource });

这是我从同一个 link

得到的第二点的代码
private static String GetResourceURL(String resourceName){
    // Fetching the resource
    List<StaticResource> resourceList= [SELECT Name, NamespacePrefix, SystemModStamp FROM StaticResource WHERE Name = :resourceName];

    // Checking if the result is returned or not
    if(resourceList.size() == 1){

       // Getting namespace
       String namespace = resourceList[0].NamespacePrefix;
       // Resource URL
       return '/resource/' + resourceList[0].SystemModStamp.getTime() + '/' + (namespace != null && namespace != '' ? namespace + '__' : '') + resourceName; 
    }
    else return '';
}

private Blob  getResourceFile(String url, String fileName) {
    PageReference tmp = new PageReference(url + '/' + fileName);
    Blob contentAsBlob = tmp.getContent();

    return contentAsBlob;
}

String url = GetResourceURL(nameOfResource);
Blob myFile = getResourceFile(url, nameOfFileToExtract);

对于第三点,它只是一行代码:

List<MetadataService.DeleteResult> deleteResults =  service.deleteMetadata('StaticResource', new String[] { resourceName });

希望这个回答对你有用。

编辑:

如果必须创建 StaticResource 然后删除它,请不要在创建和删除 callouts 之间执行 DML 操作,而是执行 [=15] =] 操作在 Callout 之后或之前,除非你想在 @future 方法中执行 callout 但它对我不起作用。

这可以通过 Zippex 库来完成。它是开源的,可在此处获取:https://github.com/pdalcol/Zippex

HttpRequest request = new HttpRequest();

/* Here set the HttpRequest Attributes */

Http http = new Http();                
HttpResponse response = http.send(request);

Blob file = response.getBodyAsBlob();

//Instantiate Zippex with zip file Blob
Zippex zip = Zippex(file);

for (String fileName : zip.getFileNames()) {    
    //Extract file
    Blob fileData = zip.getFile(fileName);
    //Process the file here
    ...
}