JavaScript(fetch API)を使用して、レコードアイテムを読み込み、
設定されているファイルURLをダウンロードURLに差し替えるの実装方法を紹介します。
ファイルをDBに格納することで、ログイン時のみファイルをダウンロードさせたい場合に便利なサンプルです。
JavaScriptコードをファイルダウンロードリンクを設置したいページに設定するだけで、
ダウンロードリンクを自動的に生成できるため、管理の手間を大幅に削減できます。
注意点
実装の概要
今回のコードでは、以下の流れで処理を行います。
例えば認証エリアにログインしたユーザにのみダウンロードリンクを表示させるため、
ファイルをDBに格納し、レコードアイテムを取得してダウンロードリンクを生成します。
1. 指定したURLからHTMLを取得
2. HTMLを解析し、対象のダウンロードリンクを抽出
3. 取得したリンクをボタンに適用し、ユーザーがクリックするとダウンロード開始
事前準備
1. ファイルを格納するためのDBを作成します(ファイルフィールド一つだけでも構いません)
2. 作成したDBからレコードアイテムブロックを発行し、任意のページに設置します。レコードリストやレコードアイテムを作成する際は公開範囲の設定を十分にお気をつけて実施してください。
3. 任意のブロックを作成し、以下のコードを設置します
任意のブロック:HTMLコード
<a id="fileDownload" href="#">ダウンロード</a>
id="fileDownload"を付与してください
任意のブロック:JavaScriptコード
// ページの読み込み完了後に処理を開始 document.addEventListener("DOMContentLoaded", () => { const downloadLink = document.getElementById("fileDownload"); // HTMLで指定したダウンロードリンクのIDを指定 if (!downloadLink) return; // クリック時にダウンロードリンクを取得・適用 downloadLink.addEventListener("click", async (event) => { event.preventDefault(); // デフォルトの動作を防ぐ const targetUrl = "/{レコードアイテムを設置したページの相対パス}?record={ファイルが格納されているDBのDBID}.{レコードID}"; try { // fetch APIを使って対象のページHTMLを取得 const response = await fetch(targetUrl); if (!response.ok) throw new Error("ページの取得に失敗しました"); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, "text/html"); // ダウンロードリンクを検索 const fileLink = doc.querySelector("a.sp-form-file-bold-link"); if (fileLink) { const fileUrl = fileLink.href; window.location.href = fileUrl; console.log("ダウンロード開始:", fileUrl); } else { console.warn("ダウンロードリンクが見つかりませんでした"); } } catch (error) { console.error("エラー:", error); } }); });
const targetUrl = "/{レコードアイテムを設置したページの相対パス}?record={ファイルが格納されているDBのDBID}.{レコードID}"の部分には、ダウンロードをさせたいDBやレコードIDを指定してください。
実行結果
画面が表示されたタイミングに非同期で指定したページからファイルのダウンロードリンクを取得し、
ダウンロードボタンのリンクが取得したダウンロードリンクに変更されます。
ユーザは、ダウンロードボタンをクリックすると直接ダウンロードできます。
まとめ
非同期処理やDOM解析の基本を理解し、より応用的な処理を組み込むことで、さまざまな場面で活用可能です。
不具合やご質問がある場合は、下記の「コンテンツに関しての要望はこちら」からご連絡ください。