要在Salesforce中实现创建案例时提取描述中的链接并自动下载并保存在附件中,可以使用Apex触发器结合HttpRequest和HttpResponse类来实现:
步骤概述
- 创建触发器:当案例(Case)被创建时触发。
- 编写Apex类:提取链接,下载文件,并将其保存为附件。
具体实现
1. 创建触发器
trigger CaseLinkAttachmentTrigger on Case (after insert) {
for (Case newCase : Trigger.new) {
if (newCase.Description != null) {
LinkAttachmentHelper.processCaseLinks(newCase);
}
}
}
2. 编写Apex Helper类
public class LinkAttachmentHelper {
@future(callout=true)
public static void processCaseLinks(Case caseRecord) {
// 提取描述中的链接
List<String> links = extractLinks(caseRecord.Description);
for (String link : links) {
try {
// 下载文件并保存为附件
HttpRequest req = new HttpRequest();
req.setEndpoint(link);
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
if (res.getStatusCode() == 200) {
// 创建附件
Attachment attachment = new Attachment();
attachment.ParentId = caseRecord.Id;
attachment.Name = getFileNameFromUrl(link);
attachment.Body = res.getBodyAsBlob();
attachment.ContentType = res.getHeader('Content-Type');
insert attachment;
}
} catch (Exception e) {
System.debug('Error processing link: ' + link + ' Error: ' + e.getMessage());
}
}
}
private static List<String> extractLinks(String description) {
List<String> links = new List<String>();
Pattern linkPattern = Pattern.compile('(https?://[^\\s]+)');
Matcher matcher = linkPattern.matcher(description);
while (matcher.find()) {
links.add(matcher.group(1));
}
return links;
}
private static String getFileNameFromUrl(String url) {
String[] parts = url.split('/');
return parts[parts.length - 1];
}
}
解释
触发器
CaseLinkAttachmentTrigger
:- 在案例创建时触发。
- 调用
LinkAttachmentHelper.processCaseLinks
方法处理案例中的链接。
Apex Helper类
LinkAttachmentHelper
:processCaseLinks
方法:使用@future(callout=true)
注解,以允许异步HTTP调用。extractLinks
方法:使用正则表达式提取描述中的链接。getFileNameFromUrl
方法:从URL中提取文件名。- HTTP请求:下载链接中的文件并保存为附件。
注意事项
- 异步处理:由于需要进行HTTP调用,因此使用
@future(callout=true)
进行异步处理。 - 错误处理:在下载和保存文件时添加错误处理,以便捕获并记录可能的错误。
- 性能考虑:对于大量链接或大文件下载,需要考虑Salesforce的限制(如DML操作次数、内存使用等)。
完成这些步骤后,系统将自动提取案例描述中的链接,下载文件并将其保存为附件。这确保了所有相关文件自动与案例关联,方便用户查看和管理。