Use Sfc.ContentDownloadHandlerFactory interface to call apex class when a file is downloaded in Salesforce.
Sample Code:
public class ContentDownloadHandlerFactoryImpl implements Sfc.ContentDownloadHandlerFactory {
public Sfc.ContentDownloadHandler getContentDownloadHandler( List<ID> listIds, Sfc.ContentDownloadContext context ) {
Sfc.ContentDownloadHandler contentDownloadHandler = new Sfc.ContentDownloadHandler();
/* To Prevent downloading it from Mobile */
if ( context == Sfc.ContentDownloadContext.MOBILE ) {
contentDownloadHandler.isDownloadAllowed = false;
contentDownloadHandler.downloadErrorMessage = 'Downloading a file from a mobile device is not allowed.';
return contentDownloadHandler;
}
contentDownloadHandler.isDownloadAllowed = true;
return contentDownloadHandler;
}
}
Note:
When a download is triggered either from the UI, Connect API, or an sObject call retrieving ContentVersion.VersionData, implementations of the Sfc.ContentDownloadHandlerFactory are looked up.
System.debug(
'Value is ' +
[ SELECT Id, VersionData
FROM ContentVersion
WHERE Id = '0684x00000377ZUAAY' ]
);
If the above code is executed, then also the apex class will be called.
But, if we use the below REST API Endpoint, then the apex class won’t be invoked.
/services/data/v51.0/sobjects/ContentVersion/0684x00000377ZUAAY
Reference Article – https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_salesforce_files_customize_downloads.htm