開発情報・ナレッジ

投稿者: ShiningStar株式会社 2024年10月15日 (火)

アップロードされるファイルの名前をレコードの値に揃えてリネームするサンプル

全体像

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

解決しない場合はこちら コンテンツに関しての
要望はこちら