LoginSignup
1
2

More than 1 year has passed since last update.

[Aura] ゲストユーザがアップロードしたファイルをレコードに紐付ける

Last updated at Posted at 2021-08-15

はじめに

Auraコンポーネントのlightnint:fileUploadを使用することで簡単にファイルアップローダーを画面に表示することができます。
fileupload.png
fileuploading.png

ファイルがアップロードされるとContentDocumentとContentVersionが作成されます。

内部ユーザ、コミュニティユーザの場合

ユーザが内部ユーザ、コミュニティユーザの場合、アップロードしたファイルのレコードへの紐付けは、lightning:fileUploadrecordId属性にSFIDを設定することで行えます。内部的にはrecordIdで設定したレコードとアップロード時に作成されたContentDocumentへの参照を持つContentDocumentLinkが作成されます。

※ただし、ログインユーザがrecordIdに指定したオブジェクトの参照権限がない場合、またはレコードが共有されていない場合、アップロードに失敗します。

Aura
<lightning:fileUpload recordId="{v.recordId}"/>

サイトゲストユーザの場合

ゲストユーザでもオブジェクトの参照権限1と、レコードの共有設定2を行うと、recordIdを使用してレコードへの紐付けが可能ですが、セキュリティ上問題があります3

そこでfileFieldName属性、fileFieldValue属性、ContentVersionトリガを使用してレコードへの紐付けを行います。

実装

1. ゲストユーザのファイルアップロード許可の設定を行う

サイトゲストユーザにファイルアップロードを許可する場合、[設定]-[機能設定]-[Salesforce Files]-[一般設定]の「サイトのゲストユーザにファイルアップロードを許可」にチェックします。
ExperienceCloudでファイルサイズの上限を設定する場合、[ワークスペース]-[管理]-[詳細]の「最大ファイルサイズ(MB)を設定します。
ExperienceCloudのゲストユーザでアップロードされたファイルの所有者は[ワークスペース]-[管理]-[詳細]の「レコードの所有者」に設定されたユーザになります。

2. ContentVersionにレコードID保存用のカスタム項目を作成する

ファイルアップロード時に、紐付け先のレコードIDを保存するためにテキストのカスタム項目をContentVersionに作成します。
API参照名はGuest_Record_fileupload__cのように、fileupload__cで終わるようにする必要があります(開発者ガイド)。

※ContentVersionへのカスタム項目追加はClassicでは行えません。LEXのオブジェクトマネージャから追加する必要があります。

3. Auraコンポーネントにlightning:fileUploadを配置する

fileFieldNameに、ContentVersionに作成したfileupload__cで終わるカスタム項目のAPI参照名を設定します。この規則に従わない項目名を設定してもエラーにはなりませんが、レコードに値は設定されません。
fileFieldValueに、紐付け先のレコードIDを設定します。

recordId属性とfileFieldValue属性は併用可能です。同じ値が設定された場合でもエラーにはなりません。異なる値を設定した場合、両方のレコードにContentDocumentLinkが作られます(recordIdで指定したレコードにアクセス権がある場合)。

Aura
<lightning:fileUpload label="Attach receipt"
    name="fileUploader"
    recordId="{!v.recordId}"
    fileFieldName="Guest_Record_fileupload__c"
    fileFieldValue="{!v.parentId}"/>

4. ContentVersionトリガでアップロードファイルのレコードへの紐付けを行う

ContentVersionにトリガを作成します。ContentDocumentLinkを作成して、アップロードファイルをfileFieldValueで指定したレコードに紐付けます。

ContentVersionTrigger.trigger
trigger ContentVersionTrigger on ContentVersion (after insert) {
    List<ContentDocumentLink> links = new List<ContentDocumentLink>();
    for (ContentVersion newObj : Trigger.new) {
        if (newObj.Guest_Record_fileupload__c == null) { continue; }
        links.add(new ContentDocumentLink(
            ContentDocumentId = newObj.ContentDocumentId,
            LinkedEntityId = newObj.Guest_Record_fileupload__c,
            Visibility = 'AllUsers',
            ShareType = 'v'
        ));
    }
    insert links;
}

Appendix

アップロードしたファイルのIDをjavascriptで取得する

onuploadfinishedでContentVersionのId、ContentDocumentのId、ファイル名を取得することができます。
紐付け先のレコードにアクセス権がない場合、documentIdはundefinedになります。

aura_cmd
<lightning:fileUpload label="Attach receipt"
    name="fileUploader"
    recordId="{!v.recordId}"
    fileFieldName="Guest_Record_fileupload__c"
    fileFieldValue="{!v.parentId}"
    onuploadfinished="{!c.doUploadFInished}"/>
aura_js
doUploadFinished : function(component, event, helper) {
    let files = event.getParam("files");
    files.forEach(file => {
        console.log(`ContentVersionId: ${file.contentVersionId}`);
        console.log(`ContentDocumentId: ${file.documentId}`);
        console.log(`Title: ${file.name}`);
    });
}

douploadfinished.png

参考


  1. ゲストユーザのオブジェクト権限は[ワークスペース]-[管理]-[ページ]-[Force.comに移動]-[公開アクセス設定]-[編集]から変更可能です。 

  2. ExperienceCloudのゲストユーザにレコードを共有するには、[設定]-[セキュリティ]-[共有設定]でルールタイプが「条件に基づくゲストユーザアクセス」のカスタムの共有ルールを作成します。ただし、ゲストユーザにレコードを共有するのはセキュリティ上避けるべきです。 

  3. Auraエンドポイントを使用したクラッキング https://www.enumerated.de/index/salesforce 

1
2
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
1
2