Webフォーム(確認画面付き)で、CSVファイルをシリアライズ&hiddenで送信してみた。
確認画面がなければ、普通にinput type = fileでいいんだけど、確認画面をはさむと値(ファイルパス)が保持できなくなる。
普通は、確認画面の段階でサーバのtmpフォルダにでも先にアップロードしちゃうんだけど、CSVファイル1個だけだったので、シリアライズ&hiddenで送信してみた。
それにしても日本人は確認画面が好き!というのは本当だな、と思う。
routes.php(web.php)
1 2 3 4 |
Route::get('/csv/upload', 'CsvsController@upload'); //アップロード画面 Route::post('/csv/upload_csv_confirm', 'CsvsController@upload_csv_confirm'); //アップロードCSV内容の確認画面 Route::post('/csv/upload', 'CsvsController@upload_csv'); //アップロードCSV取り込み処理 Route::post('/csv/upload_result', 'CsvsController@upload_result'); //アップロードCSV取り込み処理 |
アップロード画面の処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public function upload_csv_confirm(Request $request) { //アップロードされたファイル名と中身を取得 $file = $request->file('upload_csv'); // ファイルが選択されていない if (empty($file)) { return redirect()->back(); } $name = $file->getClientOriginalName(); // CSVファイルの中身を配列に格納 $upload_file = file_get_contents($file); $data = mb_convert_encoding($upload_file, 'UTF-8', 'sjis-win'); //$data = mb_convert_encoding($upload_file, 'UTF-8', 'auto'); $temp = tmpfile(); $csv = array(); fwrite($temp, $data); rewind($temp); while (($data = fgetcsv($temp, 0, ",")) !== FALSE) { $csv[] = $data; } fclose($temp); // CSVファイルの配列をシリアライズして、hiddenでPOSTする $serialized_csv = rawurlencode(serialize($csv)); return view('upload_csv_confirm')->with(compact('confirm_csv', 'serialized_csv', 'error_message')); } |
実際のアップロード処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// アップロードされたCSVファイルの内容を画面に表示 // バリデード的に問題があったらエラー表示。なければUPLOADボタンを表示 public function upload_csv(Request $request) { // シリアライズされたCSVファイルを配列に戻す $data = $request->all(); $csv = unserialize(rawurldecode($data['serialized_csv'])); // 実際のアップロード処理.... // アップロードされたCSVデータ、チェックOK/NG、エラーメッセージ return view('upload_result')->with(compact('csv','error_message')); } |
単純なCSVくらいなら、確認画面を追加しても、シリアライズ文字列に変換で対応できた。