全体像
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時点)
アクセス数が多いサイトなどで、
複数の方が同時に実行された場合、セッションの上限でエラーになってしまう可能性がございます。
ご利用の際は、事前に確認するようにしてください