Loading

ContentDownloadHandlerFactory と公開リンクを利用したファイルダウンロードの問題に対するトラブルシューティング

公開日: Oct 6, 2025
説明

ContentDownloadHandlerFactory Apex インターフェースを実装した後に、コンテンツ配信リンク (公開リンク) 経由でのファイルダウンロードに問題が発生している場合、本記事ではその一般的な原因と対処方法を説明します。 

現象

  • Salesforce 組織または Experience Cloud サイトのコンテンツ配信/公開リンク経由で、ユーザーがファイルをダウンロードできない。

  • ContentDownloadHandlerFactory インターフェースを実装する Apex クラスに変更を加えた後、ファイルのダウンロードが機能しなくなる。

  • ダウンロードに失敗しても、エンドユーザーにはエラーメッセージが表示されない。

解決策

この挙動はバグやプラットフォームの不具合ではありません。ContentDownloadHandlerFactory が、高度にセキュリティが確保され、制限された「External Who」ユーザーコンテキストと連携する方法に起因するものです。この問題に対処するうえで推奨される 2 つのアプローチは以下のとおりです。

  1. ContentDownloadHandlerFactory の実装を変更して、「External Who」ユーザーの特定のチェックをバイパスする。

    • ContentDownloadHandlerFactory 実装内の Apex コードを調整して、コードが「External Who」ユーザーのコンテキストで実行されるときに、特定のロジック (ユーザーの詳細に対する SOQL クエリなど) を識別してバイパスします。

    • 「External Who」ユーザーの名前や ID などの一意で固定のプロパティを確認すると、このユーザーコンテキストを特定できます。そのうえで、標準ユーザーアクセスを前提とする問題のあるクエリやロジックについては、条件分岐によって実行をスキップしてください。

  2. 堅牢な例外処理を実装する:

    • ContentDownloadHandlerFactory の実装内で、ユーザー詳細をクエリする処理や、制限されたコンテキストで失敗する可能性がある Apex コードは、try-catch ブロックで囲みます。

    • これにより、コンテンツ配信プロセスを中断することなく、コードで「List has no rows for assignment to SObject」の例外や同様のエラーを適切に処理できるようになります。そのうえで、該当するユーザー詳細がファイル配信に必須でない場合は、フォールバックロジックを実装するか、処理をそのまま継続してください。

これらのいずれかの解決策を実装することで、「External Who」ユーザーの制限されたコンテキストでも ContentDownloadHandlerFactory クラスを問題なく動作させ、コンテンツ配信リンクでのファイルダウンロードを正常に実行できるようになります。

その他のリソース

原因を理解する

コンテンツ配信リンクを通じてファイルがダウンロードされる場合、Salesforce のコンテンツプラットフォームは、これらのリンクを提供するために固有の内部ユーザーコンテキストを使用します。この「External Who」ユーザーは、通常のユーザーとは別に定義された存在であり、コンテンツ配信の処理専用として設計された、非常に制限された権限のみを持っています。そのため、特定のユーザーレコードの詳細への直接アクセスや共有など、多くの標準的なプラットフォーム機能は、このユーザーのコンテキストでは利用できません。

ContentDownloadHandlerFactory の実装に、実行中のユーザーに関する詳細情報を取得しようとする Apex コード (追加情報を取得するために User オブジェクトに対して SOQL クエリを実行する処理など) が含まれている場合、「External Who」ユーザーのコンテキストで実行されると、そのクエリは失敗します。この内部ユーザーは最小限のアクセス権で設計されているため、通常のユーザーのように自身のレコード詳細を取得することはできません。その結果、Apex コード内で処理が失敗し、エンドユーザーにはエラーが表示されないにもかかわらず、ファイルのダウンロードが完了しなくなります。

この根本的なエラーは、Apex ログに「List has no rows for assignment to SObject」として記録される場合があります。これは、「External Who」ユーザーの制限されたコンテキスト内でユーザー詳細を取得しようとしたクエリが結果を返さなかったことを示しています。

ナレッジ記事番号

004980253

 
読み込み中
Salesforce Help | Article