全体像
SPIRALのDBにアップロードされるファイルのファイル名は、アップロード者依存してしまいます。
ファイル名をレコードの値にリネームし、管理しやすくするためのサンプルプログラムです。
例えば自動発番される会員IDを用いてアップロードされるファイルを下記の形式にすることで、管理しやすい状態にします。
会員ID_本人確認書類.docx
会員ID_身分証写真.jpg
DB設定
任意のDBを作成して、会員IDのようなユニークになる"数字・記号・アルファベット(32 bytes)フィールド"と添付用の"ファイル型フィールド"を準備してください。
数字・記号・アルファベット(32 bytes)フィールドには自動発番設定をして会員ID(例USER_レコードID10桁)等を発番すると、
USER_0000000001_A.jpgの様な形にリネームさせる事が可能です。
次にファイルアップロード用の新規登録フォームを作成してください。
その上で後述するPHPをサンキューページのソースに貼り付けてください。
PHP(サンキューページ)
<? //<!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=OFF NAME=XXX --> ?> <?php // 変更不要 define("MULTIPART_BOUNDARY", "SPIRAL_API_MULTIPART_BOUNDARY"); // 設定値 define("API_TOKEN", ""); // APIトークン define("API_SECRET", ""); // APIシークレット define("DB_TITLE", ""); // DBタイトル define("FILE_FIELD", ""); // ファイルフィールド名 define("NAME_FIELD", ""); // ファイル名となるフィールド名 // 接頭辞と接尾辞を設定 define("PREFIX", "prefix_"); // 接頭辞 define("SUFFIX", "_suffix"); // 接尾辞 // ロケータAPIのURLとトークン $locator = "https://www.pi-pe.co.jp/api/locator"; $locator_token = API_TOKEN; // ロケータのAPI用のHTTPヘッダ $locator_headers = array( "X-SPIRAL-API: locator/apiserver/request", "Content-Type: application/json; charset=UTF-8", ); // //メイン処理 // $api_url = getLocatorUrl($locator, $locator_token, $locator_headers); $id = $SPIRAL->getContextByFieldTitle("id"); $fileName = $SPIRAL->getContextByFieldTitle(NAME_FIELD); $spiralFileData = getFileFromSpiralApi($api_url, $id); if (!empty($spiralFileData) && isset($spiralFileData['data'])) { $file_content = base64_decode($spiralFileData['data']); $original_file_name = $spiralFileData['file_name']; $dot_position = strrpos($original_file_name, '.'); $file_extension = ($dot_position !== false) ? substr($original_file_name, $dot_position + 1) : ''; $new_file_name = PREFIX . $fileName . SUFFIX . ($file_extension ? '.' . $file_extension : ''); $data = [["name" => "id", "value" => $id]]; $response = uploadFileToSpiralApi($api_url, $new_file_name, $file_content, $data, $id); // 結果を表示(デバッグしたい時にお使いください) //echo mb_convert_encoding(print_r($response, true), 'CP932', 'UTF-8'); } else { // ファイルダウンロードに失敗したときの処理 //echo "ファイルのダウンロードに失敗しました。"; } // //以下関数 // // ロケータURLを取得する関数 function getLocatorUrl($locator, $locator_token, $locator_headers) { $locator_parameters = array("spiral_api_token" => $locator_token); $locator_json = json_encode($locator_parameters); $curl = curl_init($locator); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $locator_json); curl_setopt($curl, CURLOPT_HTTPHEADER, $locator_headers); $response = curl_exec($curl); if (curl_errno($curl)) { echo curl_error($curl); exit; } $response_json = json_decode($response, true); curl_close($curl); return $response_json['location']; } // SPIRAL APIからファイルを取得する関数 function getFileFromSpiralApi($apiUrl, $id) { $parameters = [ "spiral_api_token" => API_TOKEN, "passkey" => time(), "db_title" => DB_TITLE, "file_field_title" => FILE_FIELD, "key_field_title" => "id", "key_field_value" => $id, ]; $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $parameters["signature"] = hash_hmac('sha1', $key, API_SECRET, false); $json = json_encode($parameters); $apiHeaders = [ "X-SPIRAL-API: database/get_file/request", "Content-Type: application/json; charset=UTF-8", ]; $curl = curl_init($apiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $json); curl_setopt($curl, CURLOPT_HTTPHEADER, $apiHeaders); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } // ファイルアップロード用の関数 function uploadFileToSpiralApi($apiUrl, $fileName, $fileContent, $data, $id) { $parameters = array(); $parameters["spiral_api_token"] = API_TOKEN; $parameters["db_title"] = DB_TITLE; $parameters["passkey"] = time(); $parameters["search_condition"] = [ [ "name" => "id", "value" => $id, "operator" => "=" ] ]; $parameters["data"] = $data; $key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"]; $parameters["signature"] = hash_hmac('sha1', $key, API_SECRET, false); $postdata = "--" . MULTIPART_BOUNDARY . "\r\n"; $postdata .= "Content-Type: application/json; charset='UTF-8';\r\n"; $postdata .= "Content-Disposition: form-data; name='json'\r\n\r\n"; $postdata .= json_encode($parameters); $postdata .= "\r\n\r\n"; $postdata .= "--" . MULTIPART_BOUNDARY . "\r\n"; $postdata .= "Content-Type: application/octet-stream;\r\n"; $postdata .= "Content-Disposition: form-data; name=\"" . FILE_FIELD . "\"; filename=\"" . $fileName . "\"\r\n\r\n"; $postdata .= $fileContent; $postdata .= "\r\n\r\n"; $postdata .= "--" . MULTIPART_BOUNDARY . "--\r\n"; $api_headers = array( "X-SPIRAL-API: database/update/request", "Content-Type: multipart/form-data; boundary=" . MULTIPART_BOUNDARY, ); $curl = curl_init($apiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt($curl, CURLOPT_HTTPHEADER, $api_headers); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } ?>
設定値に関して
具体的には下記のような値を設定してください。
API_TOKEN | 発行したAPIトークンを設定してださい。 |
---|---|
API_SECRET | 発行したAPIシークレットを設定してださい。 |
DB_TITLE | ファイルをアップし、リネームしたい当該DBタイトルを設定してください。 |
FILE_FIELD | ファイルがアップされるファイル型フィールドのフィールド名を設定してください。 |
NAME_FIELD | 自動発番される数字・記号・アルファベット(32 bytes)フィールドのフィールド名を設定してください。 |
PREFIX | ファイル名に接頭語をつけたい場合設定してください。(任意指定) |
SUFFIX | ファイル名に接尾辞をつけたい場合設定してください。(任意指定) |
設定値
// 設定値 define("API_TOKEN", ""); // APIトークン define("API_SECRET", ""); // APIシークレット define("DB_TITLE", ""); // DBタイトル define("FILE_FIELD", ""); // ファイルフィールド名 define("NAME_FIELD", ""); // ファイル名となるフィールド名 // 接頭辞と接尾辞を設定 define("PREFIX", "prefix_"); // 接頭辞 define("SUFFIX", "_suffix"); // 接尾辞
注意点
アカウントごとに並行でダウンロードセッションの上限が3つまでとなっております。(9/30時点)
アクセス数が多いサイトなどで、
複数の方が同時に実行された場合、セッションの上限でエラーになってしまう可能性がございます。
ご利用の際は、事前に確認するようにしてください