Lightningでは添付ファイルの扱いが変わっている

私が知っているSalesforceの添付ファイルと言えば、Attatchmentオブジェクトでした。

当社で使うアプリケーションを開発しているときに、添付ファイルをApexクラスで扱ったのですが、私の知っているSalesforceとは違っていました。

Lightningに変えると、Attatchmentオブジェクトは使われずに、Salesforce filesを使うようになるんだそうです。

となると、当然、Apexクラスでの実装も変わるので調べてみました。

ContentVersionオブジェクト

ファイルはContentVersionオブジェクトで管理します。Apexクラスでファイルを登録するには、以下のようにします。

 // ドキュメントを作成する
 ContentVersion cv = new ContentVersion();
 // ファイルはSalesforce上に保存
 cv.ContentLocation = 'S';
 // ファイル名
 cv.PathOnClient = 'expense.csv';
 // ファイルタイトル
 cv.Title = '経費明細';
 // ファイルの内容
 cv.VersionData = Blob.valueOf(content);
 insert cv;

ContentVersionオブジェクトでは、ファイルを履歴管理できるそうです。同じオブジェクトに対してドキュメントを更新すると、都度、新しいファイルが作成されると言うことですので、ファイルを取得するときは、最新データを取得する条件IsLatest=trueが必要になります。

SELECT Id,Title,VersionData FROM ContentVersion WHERE Title='経費明細' AND IsLatest=True

ContentDocumentLinkオブジェクト

ContentDocumentLinkオブジェクトは、ContentVersionオブジェクトと添付ファイルを付けたいオブジェクトをリンクするためのオブジェクトになります。

 // 登録したファイルのドキュメントIDを取得する
 Id docId = [SELECT ContentDocumentId FROM ContentVersion WHERE Id =:cv.Id].ContentDocumentId;

 // レコードとドキュメントをリンクする
 ContentDocumentLink cde = new ContentDocumentLink();
 // リンクするドキュメントID
 cde.ContentDocumentId = docId;
 // 添付ファイルとしてリンクするオブジェクトのレコードID
 cde.LinkedEntityId = recordId;
 cde.ShareType = 'V';
 insert cde;

[SELECT ContentDocumentId FROM ContentVersion WHERE Id =:cv.Id].ContentDocumentIdでは、上でContentVersionオブジェクトに登録したファイルのContentDocumentIdを取得しています。

ContentDocumentIdと添付するオブジェクトのレコードIDをLinkedEntiryIdに設定して登録します。

完成

これで、添付ファイルとして登録することができます。