[Aura] ゲストユーザがアップロードしたファイルをレコードに紐付ける
はじめに
Auraコンポーネントのlightnint:fileUpload
を使用することで簡単にファイルアップローダーを画面に表示することができます。
ファイルがアップロードされるとContentDocumentとContentVersionが作成されます。
内部ユーザ、コミュニティユーザの場合
ユーザが内部ユーザ、コミュニティユーザの場合、アップロードしたファイルのレコードへの紐付けは、lightning:fileUpload
のrecordId
属性にSFIDを設定することで行えます。内部的にはrecordId
で設定したレコードとアップロード時に作成されたContentDocumentへの参照を持つContentDocumentLinkが作成されます。
※ただし、ログインユーザがrecordIdに指定したオブジェクトの参照権限がない場合、またはレコードが共有されていない場合、アップロードに失敗します。
<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で指定したレコードにアクセス権がある場合)。
<lightning:fileUpload label="Attach receipt"
name="fileUploader"
recordId="{!v.recordId}"
fileFieldName="Guest_Record_fileupload__c"
fileFieldValue="{!v.parentId}"/>
4. ContentVersionトリガでアップロードファイルのレコードへの紐付けを行う
ContentVersionにトリガを作成します。ContentDocumentLinkを作成して、アップロードファイルをfileFieldValueで指定したレコードに紐付けます。
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になります。
<lightning:fileUpload label="Attach receipt"
name="fileUploader"
recordId="{!v.recordId}"
fileFieldName="Guest_Record_fileupload__c"
fileFieldValue="{!v.parentId}"
onuploadfinished="{!c.doUploadFInished}"/>
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}`);
});
}
参考
- lightning:fileUpload | Lightning Component Library
- ContentDocumentLink | Salesforce および Lightning プラットフォームのオブジェクトリファレンス
-
ゲストユーザのオブジェクト権限は[ワークスペース]-[管理]-[ページ]-[Force.comに移動]-[公開アクセス設定]-[編集]から変更可能です。 ↩
-
ExperienceCloudのゲストユーザにレコードを共有するには、[設定]-[セキュリティ]-[共有設定]でルールタイプが「条件に基づくゲストユーザアクセス」のカスタムの共有ルールを作成します。ただし、ゲストユーザにレコードを共有するのはセキュリティ上避けるべきです。 ↩
-
Auraエンドポイントを使用したクラッキング https://www.enumerated.de/index/salesforce ↩
Author And Source
この問題について([Aura] ゲストユーザがアップロードしたファイルをレコードに紐付ける), 我々は、より多くの情報をここで見つけました https://qiita.com/TaaaZyyy/items/f5853a3f45ea2e46e892著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .