最近、コミュニティ用のコンポーネントで画像を扱う機会があり、そのあたりの試行錯誤についての備忘録です。
(件名は良いタイトルが思いついたら変更します!)
オブジェクト別画像表示URL
よく忘れて何回も調べるので書きておきます。
添付(Attachment)の場合
<img src="/servlet/servlet.FileDownload?file=00PXXXXXXXXXXXXXXX" />
ファイル(ContentVersion)の場合
<img src="/sfc/servlet.shepherd/version/download/068XXXXXXXXXXXXXXX" />
添付の場合は、画像の親レコードへのアクセス権が必要ですが、比較的どこからでも簡単にアクセス出来るので便利な印象です。
一方、ファイルの方が制限が厳しいイメージです。ゲストユーザなどのアクセスも出来ないようなので、利用時には注意が必要ですね。
いい感じに画像表示用のURLを作成してくれるメソッド
表示したい画像のIDを受け取り表示先やユーザに合わせてURLを作成してくれるメソッドを書いてみました。
ゲストユーザなどは、URLでのアクセスが出来ず、やむを得ずBase64で返すようにしました(なので4MBくらいまでの画像しか扱えないですね)
足りていないケースが有ったら随時追加していきたかったので、かなり冗長的なコードになっています。
対応オブジェクト
- Attachment(00P)
- ContentVersion(068)
- ContentDocument(069)
public static Object getImageSource(String recordId) {
// 表示サイトの識別
Boolean isLEX = String.isBlank(Site.getSiteId());
Boolean isSite = String.isNotBlank(Site.getSiteId());
// ユーザタイプの識別
Boolean isInternalUser = Auth.CommunitiesUtil.isInternalUser();
Boolean isGuestUser = Auth.CommunitiesUtil.isGuestUser();
// オブジェクトタイプを識別
Boolean isAttachment = recordId.startsWith('00P');
Boolean isContentVersion = recordId.startsWith('068');
Boolean isContentDocument = recordId.startsWith('069');
String src = '';
if (isLEX && isAttachment) {
src = '/servlet/servlet.FileDownload?file=' + recordId;
} else if (isLEX && isContentVersion) {
src = '/sfc/servlet.shepherd/version/download/' + recordId;
} else if (isLEX && isContentDocument) {
ContentVersion content = [SELECT Id FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
src = '/sfc/servlet.shepherd/version/download/' + content.Id;
} else if (isSite && isAttachment) {
src = Site.getBaseUrl() + '/servlet/servlet.FileDownload?file=' + recordId;
} else if (isSite && isContentVersion && isInternalUser) {
src = Site.getBaseUrl() + '/sfc/servlet.shepherd/version/download/' + recordId;
} else if (isSite && isContentVersion && !isInternalUser) {
ContentVersion content = [SELECT Id, FileType, VersionData FROM ContentVersion WHERE Id =: recordId][0];
src = 'data:image/' + content.FileType + ';base64,' + EncodingUtil.base64Encode(content.VersionData);
} else if (isSite && isContentDocument && isInternalUser) {
ContentVersion content = [SELECT Id FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
src = Site.getBaseUrl() + '/sfc/servlet.shepherd/version/download/' + content.Id;
} else if (isSite && isContentDocument && !isInternalUser) {
ContentVersion content = [SELECT Id, FileType, VersionData FROM ContentVersion WHERE ContentDocumentId =: recordId ORDER BY VersionNumber DESC][0];
src = 'data:image/' + content.FileType + ';base64,' + EncodingUtil.base64Encode(content.VersionData);
}
return src;
}