ワードプレスで複数添付ファイルを複数フィールドにアップロードしたいと思い、下記の様にコードを書いてみましたが、実行したらエラーがこんな感じです。
{"code":"GAIA_IF02","id":"d5YcKy1m0CFPx71bTVna","message":"fileKeyパラメーター(202303020500536DB06770C85442D7973A69517998A27B228)の形式が不正です。"}{"code":"GAIA_IF02","id":"7FOkQBZY4mEfyNHBgjTe","message":"fileKeyパラメーター(202303020500536DB06770C85442D7973A69517998A27B228)の形式が不正です。"}{"code":"GAIA_IF02","id":"CfJ2ORVbKuanh7mU45yk","message":"fileKeyパラメーター(202303020500536DB06770C85442D7973A69517998A27B228)の形式が不正です。"}
ご教示頂けましたら幸いです。
<?php
// APIトークン
define( 'API_TOKEN', 'WfQK8HKLz5hWmZtkZoGrjlVQfCqnzoeBSpQ7H4kO' );
// アプリID
define( 'APP_NO', '54' );
// サブドメイン
define( 'SUB_DOMAIN', 'fd4hcg8uk2zs' );
//file Upload
if ( isset( $_FILES[ 'up_file1' ] ) && isset( $_FILES[ 'up_file2' ] ) && isset( $_FILES[ 'up_file3' ] ) ) {
// 3つのファイルアップロードフィールドについてループ処理を行う
for ( $i = 1; $i <= 3; $i++ ) {
$files = $_FILES[ 'up_file' . $i ];
$file_desc = reArrayFiles( $files );
$record_num = $_POST[ 'record_number' ];
file_upload( $file_desc, $record_num, 'file_' . $i );
}
}
function reArrayFiles($files){
$file_ary = array();
$file_count = count($files['name']);
$file_key = array_keys($files);
for($i=0;$i<$file_count;$i++)
{
foreach($file_key as $val)
{
$file_ary[$i][$val] = $files[$val][$i];
}
}
return $file_ary;
}
$record_num = $_POST[ 'record_number' ];
$kintones = get_kintone_data( $record_num ); //kintoneのレコード取得
for ( $i = 0; $i < count( $kintones[ 'records' ] ); $i++ ) {
$date_time = $kintones[ 'records' ][ $i ][ '日時' ][ 'value' ];
}
//include for CSS and Javascript files
add_action( 'wp_enqueue_scripts', 'kintone_enqueue_styles' );
function kintone_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/kintone/css/kintone-style.css' );
}
add_action( 'wp_enqueue_scripts', 'kintone_enqueue_script' );
function kintone_enqueue_script() {
wp_enqueue_script( 'file-upload', get_template_directory_uri() . '/kintone/js/file-upload.js', array( 'jquery' ), '1.0.0', true );
wp_enqueue_script( 'jquery.uploadThumbs', get_template_directory_uri() . '/kintone/js/jquery.uploadThumbs.js', array( 'jquery' ), '1.0.0', true );
}
//*****************************************
// アプリデータ取得
//*****************************************/
function get_kintone_data( $record_num ) {
$url = "https://" . SUB_DOMAIN . ".cybozu.com/k/v1/records.json?app=" . APP_NO . "";
$search = "レコード番号 = \"{$record_num}\"";
$url .= '&query=' . utf8_uri_encode( $search );
$args = array(
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN
)
);
$kintone = wp_remote_get( $url, $args );
$kintones = json_decode( $kintone[ 'body' ], true );
return $kintones;
}
// *****************************************
// ファイルアップロード
// *****************************************/
function file_upload($files, $record_num, $field_name){
for ($f = 0; $f < count($files); $f++) {
$upload_url = "https://" . SUB_DOMAIN . ".cybozu.com/k/v1/file.json";
$file_path = $files[$f]['tmp_name'];
$file_name = $files[$f]['name'];
// curlでアップロード
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $upload_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'X-Cybozu-API-Token:' . API_TOKEN
]);
curl_setopt($curl, CURLOPT_POST, true);
$file = new CURLFile($file_path, 'application/octet-stream', $file_name);
curl_setopt($curl, CURLOPT_POSTFIELDS, array('file' => $file));
$res = curl_exec($curl);
$response = json_decode($res, true);
curl_close($curl);
//アップロードが成功するとkeyが返ってきます。
for($i=0; $i<count($response); $i++){
$key = $response['fileKey'];
}
//アプリデータ取得
$url = "https://".SUB_DOMAIN.".cybozu.com/k/v1/records.json?app=".APP_NO."";
$search = "レコード番号 = \"{$record_num}\"";
$url .= '&query='. utf8_uri_encode( $search );
$args = array(
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN
)
);
$kintone = wp_remote_get( $url, $args );
$kintones = json_decode($kintone['body'],true);
//添付ファイル ここはわかりません
$subtable = $kintones['records'][0]['添付ファイル']['value'];
//keyを"fileKey" => $keyの形で配列に入れる
if($key){
$key_array = array(array("fileKey" => $key));
}else{
$key_array = "";
}
//取得した添付ファイルデータにアップロードするkeyを追加(ここにも困ります)
$result_key = array_merge($subtable, $key_array);
//bodyにアプリ番号とレコード番号とkeyをセット
$body = array(
"app" => APP_NO,
"id" => $record_num,
"record" => array(
"file_1" => array (
"value" => $result_key
),
"file_2" => array (
"value" => $result_key
),
"file_3" => array (
"value" => $result_key
),
),
);
//レコードの上書きなのでPUTで書き込みます。
$options = array(
'method'=> 'PUT',
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN,
'Content-Type' => 'application/json'
),
'body' => json_encode($body)
);
//PUTで書き込むのでwp_remote_requestを使います。
$results = wp_remote_request("https://".SUB_DOMAIN.".cybozu.com/k/v1/record.json", $options);
//書き込み成功だったらrevisionが返ってきます。
print_r($results['body']);
}
}
?>
<form method="post" action="" enctype="multipart/form-data">
<label for="file">ファイル1を選択してください。</label>
<input type="file" name="up_file1[]" multiple="multiple" onchange="OnFileSelect(this);">
<br>
<label for="file">ファイル2を選択してください。</label>
<input type="file" name="up_file2[]" multiple="multiple" onchange="OnFileSelect(this);">
<br>
<label for="file">ファイル3を選択してください。</label>
<input type="file" name="up_file3[]" multiple="multiple" onchange="OnFileSelect(this);">
<br>
<label for="record_number">レコード番号を入力してください。</label>
<input type="text" name="record_number" id="record_number">
<br>
<input type="submit" id="upload" value="アップロード">
</form>
1件のコメント
もともと自分が書いたのはこれですが、
<?php
// APIトークン
define('API_TOKEN', '85fqk8OE591bjDkdsEKv38u0I6hv2G555Qn0pJyk');
// アプリID
define('APP_NO', '57');
// サブドメイン
define('SUB_DOMAIN', 'fd4hcg8uk2zs');
//file Upload
if(isset($_FILES['up_file'])){
$files = $_FILES['up_file'];
$file_desc = reArrayFiles($files); //$ _FILES配列を変換
$record_num = $_POST['record_number'];//今回はレコード番号は決め打ちで
file_upload($file_desc, $record_num); //関数にファイルとレコード番号を渡します
}
function reArrayFiles($files){
$file_ary = array();
$file_count = count($files['name']);
$file_key = array_keys($files);
for($i=0;$i<$file_count;$i++)
{
foreach($file_key as $val)
{
$file_ary[$i][$val] = $files[$val][$i];
}
}
return $file_ary;
}
$record_num = $_POST['record_number'];
$kintones = get_kintone_data($record_num);//kintoneのレコード取得
for($i=0; $i<count($kintones['records']); $i++){
$date_time = $kintones['records'][$i]['日時']['value'];
}
//include for CSS and Javascript files
add_action( 'wp_enqueue_scripts', 'kintone_enqueue_styles' );
function kintone_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/kintone/css/kintone-style.css' );
}
add_action( 'wp_enqueue_scripts', 'kintone_enqueue_script' );
function kintone_enqueue_script() {
wp_enqueue_script('file-upload', get_template_directory_uri().'/kintone/js/file-upload.js', array('jquery'), '1.0.0', true);
wp_enqueue_script('jquery.uploadThumbs', get_template_directory_uri().'/kintone/js/jquery.uploadThumbs.js', array('jquery'), '1.0.0', true);
}
//*****************************************
// アプリデータ取得
//*****************************************/
function get_kintone_data($record_num){
$url = "https://".SUB_DOMAIN.".cybozu.com/k/v1/records.json?app=".APP_NO."";
$search = "レコード番号 = \"{$record_num}\"";
$url .= '&query='. utf8_uri_encode( $search );
$args = array(
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN
)
);
$kintone = wp_remote_get( $url, $args );
$kintones = json_decode($kintone['body'],true);
return $kintones;
}
//*****************************************
// ファイルアップロード
//*****************************************/
function file_upload($files, $record_num)
{
//複数ファイルアップロードなのでfor文で一つづつアップロード
for($f=0; $f<count($files); $f++){
$upload_url = "https://".SUB_DOMAIN.".cybozu.com/k/v1/file.json";
$file_path = $files[$f]['tmp_name'];
$file_name = $files[$f]['name'];
//今回はcurlでアップロードします。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $upload_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST" );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'X-Cybozu-API-Token:'.API_TOKEN
]);
curl_setopt($curl, CURLOPT_POST, true);
$file = new CURLFile($file_path, 'application/octet-stream', $file_name);
curl_setopt(
$curl, CURLOPT_POSTFIELDS, array('file' => $file)
);
//php5.4以下はこちら
// $data = array('name' => $file_name, 'file' => '@'.$file_path . ';filename=' . $file_name);
// curl_setopt(
// $curl, CURLOPT_POSTFIELDS, $data
// );
$res = curl_exec($curl);
$resuponse = json_decode( $res , true );
curl_close ($curl);
//アップロードが成功するとkeyが返ってきます。
for($i=0; $i<count($resuponse); $i++){
$key = $resuponse['fileKey'];
}
//アプリデータ取得
$url = "https://".SUB_DOMAIN.".cybozu.com/k/v1/records.json?app=".APP_NO."";
$search = "レコード番号 = \"{$record_num}\"";
$url .= '&query='. utf8_uri_encode( $search );
$args = array(
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN
)
);
$kintone = wp_remote_get( $url, $args );
$kintones = json_decode($kintone['body'],true);
//添付ファイル
$subtable = $kintones['records'][0]['添付ファイル']['value'];
//keyを"fileKey" => $keyの形で配列に入れる
if($key){
$key_array = array(array("fileKey" => $key));
}else{
$key_array = "";
}
//取得した添付ファイルデータにアップロードするkeyを追加
$result_key = array_merge($subtable, $key_array);
//bodyにアプリ番号とレコード番号とkeyをセット
$body = array(
"app" => APP_NO,
"id" => $record_num,
"record" => array(
"添付ファイル" => array (
"value" => $result_key
),
),
);
//レコードの上書きなのでPUTで書き込みます。
$options = array(
'method'=> 'PUT',
'headers' => array(
'X-Cybozu-API-Token' => API_TOKEN,
'Content-Type' => 'application/json'
),
'body' => json_encode($body)
);
//PUTで書き込むのでwp_remote_requestを使います。
$results = wp_remote_request("https://".SUB_DOMAIN.".cybozu.com/k/v1/record.json", $options);
//書き込み成功だったらrevisionが返ってきます。
print_r($results['body']);
}
}
?>
<form method="post" action="" enctype="multipart/form-data">
<label for="file">ファイルを選択してください。</label>
<input type="file1" name="up_file1[]" multiple="multiple" ><br>
<label for="file">ファイルを選択してください。</label>
<input type="file2" name="up_file2[]" multiple="multiple" ><br>
<label for="record_number">レコード番号を入力してください。</label>
<input type="text" name="record_number" id="record_number"><br>
<input type="submit" id="upload" value="アップロード">
</form>