Beware of a hacky solution!
@RestResource(urlMapping='/ContentDoc/*')
global without sharing class ImageProxy {
public static Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();
public static String findObjectNameFromRecordIdPrefix(String recordIdOrPrefix){
String objectName = '';
try{
//Get prefix from record ID
//This assumes that you have passed at least 3 characters
String myIdPrefix = String.valueOf(recordIdOrPrefix).substring(0,3);
//Loop through all the sObject types returned by Schema
for(Schema.SObjectType stype : gd.values()){
Schema.DescribeSObjectResult r = stype.getDescribe();
String prefix = r.getKeyPrefix();
System.debug('Prefix is ' + prefix);
//Check if the prefix matches with requested prefix
if(prefix!=null && prefix.equals(myIdPrefix)){
objectName = r.getName();
System.debug('Object Name! ' + objectName);
break;
}
}
} catch(Exception e) {
System.debug(e);
}
return objectName;
}
global static String imageProxySiteUrl = SandboxPostDataRecovery.generateImageProxyBaseString();
@HttpGet
global static void getBlob() {
RestResponse res = RestContext.response;
RestRequest req = RestContext.request;
String url = null;
String b = req.requestURI;
String s = EncodingUtil.base64Decode(req.requestURI.split('/ContentDoc/')[1]).toString().replaceAll('&','&');
Boolean isPdf = false;
if(s.startsWith('pdf')){
s = s.removeStart('pdf');
isPdf = true;
}
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setMethod('GET');
String language = 'German';
if (s.indexOf('sfc/servlet.shepherd/version') >= 0){
if(!isPdf){
String cid = s.split('/version/download/')[1].split('\\?')[0];
url = 'callout:Self/services/data/v59.0/sobjects/ContentVersion/' + cid + '/VersionData';
} else {
List<String> params = s.split('/version/download/')[1].split('\\?hash=');
if(params.size() == 2){
String cid = params[0];
String hash = params[1];
// Verification
List<ContentVersion> cvl= [SELECT Id, Language__c FROM ContentVersion WHERE Id = : cid AND Hash__c = : hash];
if(!cvl.isEmpty()){
language = cvl[0].Language__c;
url = 'callout:Self/services/data/v59.0/sobjects/ContentVersion/' + cid + '/VersionData';
}
}
}
} else if (s.indexOf('/servlet/rtaImage') >= 0) {
Map<String,String> paramMap = new Map<String,String>();
//content Version
for (String cid : s.split('/servlet/rtaImage\\?')[1].split('&')){
System.debug(cid);
paramMap.put(cid.split('=')[0], cid.split('=')[1]);
}
String recId = paramMap.get('eid');
String fieldID = paramMap.get('feoid');
String refId = paramMap.get('refid');
String objectType = findObjectNameFromRecordIdPrefix(recId);
if (Test.isRunningTest()) {
return;
}
FieldDefinition fd = [
SELECT Id, DeveloperName, DurableId, QualifiedApiName
FROM FieldDefinition
WHERE DurableId = : objectType +'.' + fieldID];
url = 'callout:Self/services/data/v59.0/sobjects/' + objectType + '/' + recId + '/richTextImageFields/' + fd.QualifiedApiName + '/' + refId + '';
}
request.setEndpoint(url);
if (Test.isRunningTest()){
return;
}
try {
HttpResponse response = http.send(request);
if (response.getStatusCode() == 200) {
Blob a = response.getBodyAsBlob();
if (response.getHeader('Content-Type') == 'application/octetstream'){
if(isPdf){
res.addHeader('Content-Type','application/pdf');
res.addHeader('Content-Disposition','inline');
} else {
res.addHeader('Content-Type','image/png');
}
} else{
res.addHeader('Content-Type',response.getHeader('Content-Type'));
}
String afterblob = EncodingUtil.base64Encode(a);
res.responseBody =EncodingUtil.base64Decode(afterblob);
} else {
res.addHeader('Content-Type','text/plain');
res.responseBody = Blob.valueOf(response.getBody());
}
} catch(Exception e) {
res.addHeader('Content-Type','text/plain');
res.responseBody = Blob.valueOf((language == 'German' ? System.Label.ImageProxyGermanError : System.Label.ImageProxyEnglishError) + ': ' + e.getMessage());
}
}
global class ExtractFieldName {
@InvocableVariable(label='Record Id' required=true)
global Id recordId;
@InvocableVariable(label='Rich Text' required=false)
global String richText;
@InvocableVariable(label='URL Field API Name' required=true)
global String urlFieldName;
}
@InvocableMethod(label='Extract Image Url')
global static void extractFieldNameActionsBatch(List<ExtractFieldName> requests) {
for(ExtractFieldName request: requests){
extractFieldNameAction(request);
}
}
public static void extractFieldNameAction(ExtractFieldName request) {
System.debug(request.recordId);
Id recordId = request.recordId;
String sObjectType = recordId.getSObjectType().getDescribe().getName();
sObject o1 = Schema.getGlobalDescribe().get(sObjectType).newSObject(recordId);
String url = null;
if (String.isNotBlank(request.richText)){
for (String token : request.richText.split('"')){
if (token.indexOf('rtaImage') >= 0 || token.indexOf('servlet.shepherd') >= 0 ){
url = imageProxySiteUrl + '/services/apexrest/ContentDoc/' + EncodingUtil.base64Encode(Blob.valueOf(token));
}
}
}
o1.put(request.urlFieldName, url);
System.debug(sobjectType);
System.debug(o1);
update o1;
}
}