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
...
}
我正在 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
...
}