LoginSignup
4
4

More than 5 years have passed since last update.

あなたが表示してほしいと言って差し出したその手に握られていたのは 00P から始まる画像 ID だった

Posted at

最近、コミュニティ用のコンポーネントで画像を扱う機会があり、そのあたりの試行錯誤についての備忘録です。
(件名は良いタイトルが思いついたら変更します!)

オブジェクト別画像表示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;
}  
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4