前提・実現したいこと
画面側(Nuxt.js)からサーバー側(CodeIgniter)にファイルとテキストボックスの値をPOSTしたいです。
最終的な環境はNuxt.jsとCodeIgniterが別々のサーバーで動きます。
今試しているのは開発環境で同じPC上で動いていますがポートが違います。
POSTする値にファイルが含まれるとサーバー側でテキストボックスの値も受け取れなくなる状態です。
どなたかご存知の方、アドバイス頂けたら幸いです。
発生している問題・エラーメッセージ
POST値にファイルが含まれるとサーバーで値を受け取れない
※下記該当のソースの「取得できるかの実験」のところでデバッグで確認しても値が取れていません。
該当のソースコード
(画面側)
javascript
1<template> 2 <div> 3 <el-form ref="form" :model="form" label-width="120px"> 4 <el-form-item label="年月"> 5 <el-date-picker 6 name="ym" 7 v-model="form.ym" 8 type="month" 9 placeholder="Pick a month"> 10 </el-date-picker> 11 </el-form-item> 12 <el-form-item label="ファイル"> 13 <input type="file" @change="selectedFile" name="uploadFile" /> 14 </el-form-item> 15 <el-form-item> 16 <div class="button-wrapper-mint" @click="upload"> 17 保存 18 </div> 19 </el-form-item> 20 </el-form> 21 </div> 22</template> 23<script> 24export default { 25 data(){ 26 return { 27 form: { 28 ym: "", 29 uploadFile: null, 30 } 31 } 32 }, 33 methods:{ 34 selectedFile(e) { 35 e.preventDefault(); 36 let files = e.target.files; 37 this.form.uploadFile = files[0]; 38 }, 39 upload(){ 40 let config = { 41 headers: {'content-type': 'multipart/form-data'} 42 }; 43 let formData = new FormData(); 44 formData.append('ym', this.form.ym); 45 formData.append('uploadFile', this.form.uploadFile); 46 this.$axios.post( 47 "http://~~~", 48 formData, 49 config 50 ).then((response) =>{ 51 console.log(response); 52 }); 53 } 54 }, 55} 56</script>
送信した時のForm Dataの中身(Chromeの開発者ツールから取得)
(サーバー側)
php
1 public function upload(){ 2 header('Access-Control-Allow-Origin: *'); 3 $method = $this->input->server('REQUEST_METHOD'); 4 if($method == "OPTIONS"){ 5 $this->output->set_content_type('application/json')->set_output(json_encode(array( 6 "status" => "OK", 7 ))); 8 return; 9 } 10 if($method != "POST"){ 11 return; 12 } 13 14 // 取得できるかの実験 --------------------- 15 $ym= $this->input->get_post('ym', TRUE) ?: ""; 16 $_POST; 17 $data = json_decode(file_get_contents("php://input"), TRUE); 18 // ----------------------------------- 19 20 $config = array( 21 'upload_path' => './upload', 22 'overwrite' => TRUE, 23 'allowed_types' => '*', 24 'file_name' => date('YmdHis').".csv", 25 ); 26 $this->load->library('upload', $config); 27 28 if ( ! $this->upload->do_upload("uploadFile")) { 29 $error = array('error' => $this->upload->display_errors()); 30 $this->output->set_content_type('application/json')->set_output(json_encode(array( 31 "status" => "NG", 32 "error" => $error // ☆<p>You did not select a file to upload.</p> 33 ))); 34 } else { 35 $this->output->set_content_type('application/json')->set_output(json_encode(array( 36 "status" => "OK", 37 ))); 38 } 39 }
※デバッグで確認すると取得できるかの実験のところが3つとも空になります。
※☆の所の$errorには<p>You did not select a file to upload.</p>
が入っていました。
試したこと
1. ソースを変えずに、画面でファイルを未選択で送信
⇒ ym
の値は取得できた
**2. axiosを使わずにformで送信 **
javascript
1<template> 2 <div class="padding-box"> 3 <form method="POST" action="(URL)" enctype="multipart/form-data"> 4 <el-date-picker 5 name="ym" 6 v-model="form.ym" 7 type="month" 8 placeholder="Pick a month"> 9 </el-date-picker> 10 <input type="file" name="uploadFile" /> 11 <input type="submit" value="保存" /> 12 </form> 13 </div> 14</template>
⇒同じ状態(サーバー側でデータが取得できない)
3. 同じポートで動かしてみる
同じlocalhost
でもポートが違うとCORSエラーが発生したので、Access-Control-Allow-Origin
以外に設定がいるのか切り分けるため、Nuxt.jsをgenerateしたものをPHPを動かしているApacheで動かしてみましたが結果は同じでした。。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/17 07:38
2019/09/17 08:07
2019/09/17 12:17