LoginSignup
5
4

More than 3 years have passed since last update.

【Salesforce】ContentDistributionを使ってファイルをパスワード化!

Last updated at Posted at 2019-09-11

はじめに

ContentDistributionを使用すると以下のことができました!

  • アップロードしたファイルへのアクセスに対してパスワードを付与する
  • ファイルに対してURLを発行し、ログインせずにアクセスできる
  • URLをメールの文章に置き換えることによって、メールで共有できる # 実際に作ってみた

想定シチュエーションはこんな感じ

\(^o^)/はじまり

  1. ケース(Case)を作成する
  2. ケースにファイルをアップロードする
  3. ケースの状況(Status)を[Closed]に変更する
  4. ケースのトリガが動く(BeforeUpdate)
  5. 2.でアップロードしたファイル(ContentVersion)を取得する
  6. ContentDistributionを作成する
  7. ContentDistributionのContentDownloadUrlを1.で作成したケースの説明(Description)に設定する
  8. ワークフローにてメールを送信する

\(^o^)/おわり

コードはこんな感じ

CaseTrigger

CaseTrigger.trigger
trigger CaseTrigger on Case(before update) {
  if(Trigger.isUpdate && Trigger.isBefore){
    CaseTriggerHandler handler = new CaseTriggerHandler();
    handler.onBeforeUpdate(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
  }
}

CaseTriggerHandler

CaseTriggerHandler.cls
public void onBeforeUpdate(Case[] newList, Map<Id, Case> newMap, Case[] oldList, Map<Id, Case> oldMap){
  // 処理対象のケースを保持するため、変数を用意する(今回は単一レコードの処理を想定)
  Case targetCase = new Case();
  // 状況が[Closed]に変更されたケースを取得する
  if(newList[0].Status == 'Closed' && oldList[0].Status != 'Closed'){
    targetCase = newList[0];
  }

  // 処理対象のケースが存在する場合、紐づいているファイルを取得する
  ContentVersion targetCV = new ContentVersion();
  if(targetCase.Id != NULL){
    targetCV = [SELECT Id, Title, VersionData
           FROM ContentVersion
           WHERE FirstPublishLocationId = :targetCase.Id
           ORDER BY CreatedDate Desc
           LIMIT 1];
  }

  // 処理対象のファイルが存在する場合、ContentDistributionを作成する
  if(targetCV.Id != NULL){
    ContentDistribution cD = new ContentDistribution();
    cD.Name = targetCV.Title;
    cD.ContentVersionId = targetCV.Id;
    cD.PreferencesPasswordRequired = true;
    insert cD;
    // URL、パスワードがNULLの状態のため、再取得を行う
    cD = [SELECT DistributionPublicUrl, Password FROM ContentDistribution WHERE Id = :cD.Id];

    targetCase.Description = cD.DistributionPublicUrl;
    targetCase.Description += '\r\n';
    targetCase.Description += cD.Password;
  }
}

動作時のキャプチャ

1.ケース(Case)を作成する

無題.png
無題.png

2.ケースにファイルをアップロードする

無題.png

3.ケースの状況(Status)を[Closed]に変更する

無題.png

4.5.6は割愛

7.ContentDistributionのContentDownloadUrlを1.で作成したケースの説明(Description)に設定する

※insert直後だとまだ値が設定されていないので再度取得すること!
無題.png
パスワードは大文字小文字含めた英字8文字です。
数字を組み合わせたり、文字数を変更することはできませんでした。
※画像は手修正後のものです
無題.png

8.ワークフローにてメールを送信する

送れた~!
無題.png

URLをクリックしてダウンロードしてみた

こんな感じの画面に遷移します!
※URLがSalesforceです!って感じなのでお客さんによっては嫌がるだろうなあ・・・
無題.png
パスワードを間違えるとこんな感じになります!
無題.png
パスワード入力時はマスクがかかります!
無題.png
正しいパスワードを入力すると、以下の画面に遷移!
無題.png
ダウンロードボタンを押下すれば問題なくダウンロードできました!
無題.png

こんなことはできないのかなあ?

  • アップロードしたファイル自体にパスワードを付与する
  • パスワードの桁数や設定文字を開発者が決める

などなど・・・

参考リンク

SOAP API 開発者ガイド:ContentVersion
SOAP API 開発者ガイド:ContentDistribution

ワークフローで久しぶりにメール送った

こんなもんで あぁ~~イイッすかねェェェェェ~~と

5
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
5
4