我正在Salesforce
开发一个应用程序,我使用zip file
从HttpRequest
形成一个外部服务器。
我从服务器获取的文件是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*/
答案 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
,但它对我不起作用。