Salesforce在Blob Zip文件中提取文件

时间:2015-08-13 16:12:50

标签: zip salesforce blob unzip apex

我正在Salesforce开发一个应用程序,我使用zip fileHttpRequest形成一个外部服务器。

我从服务器获取的文件是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*/

3 个答案:

答案 0 :(得分:1)

这可以通过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
    ...
}

答案 1 :(得分:0)

Salesforce不支持zip文件提取。您必须在外部托管服务中执行此操作。

答案 2 :(得分:0)

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

<强> 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 });

这是我从同一个链接获得的第二个点的代码

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);

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

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

我希望这个答案有用。

修改

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