新規投稿
フォローする

複数添付ファイルをアップロードする

ワードプレスで複数添付ファイルを複数フィールドにアップロードしたいと思い、下記の様にコードを書いてみましたが、実行したらエラーがこんな感じです。

{"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>

0

1件のコメント

Avatar
Nguyễn Trọng Hoàn

もともと自分が書いたのはこれですが、

<?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>

0
サインインしてコメントを残してください。