前提・実現したいこと
input type=fileで選択したcsvをajaxでPHPに送り、PHPでそのcsvを非同期で処理したいと思っています。
しかし、その送られてきたファイルをPHPでfile_get_contents()
しても返り値がnullになります。
現段階では、送られてきたCSVの中身を文字列ないし、fgetcsv()
で扱えるようになりたいです。
submitは使えない前提です。
発生している問題
PHP側のファイルの扱い方が間違っているのか、JS側のajax通信の仕方が間違っているのか、ファイルの中身を取得出来ません。
現在、PHP側を試しに下記のようなコードにしています。
js側でconsole.log()
にてこのfile_get_contents($fp)
の返り値を見るとnull
になっておりました。
php
1$tmp_name = $_FILES['file']['tmp_name']; 2$fp = fopen($tmp_name, 'rb'); 3header('Content-type: application/json'); 4echo file_get_contents($fp);
js->phpのリクエスト自体は200で成功しています。
下記が送信したフォームデータをChromeの開発者モードで見たものです。
file: (binary) flag: csvUpload pid: 1
該当のソースコード
html
1<div class="form-group"> 2 <input type="file" class="form-control-file" id="csvFile" accept="text/csv"> 3</div> 4<div class="form-group"> 5 <button type="button" class="btn btn-success" id="uploadBtn">アップロード</button> 6</div>
js
1$(document).on('click','#uploadBtn',function(){ 2 var fd = new FormData(); 3 fd.append("file", $("#csvFile").prop("files")[0]); 4 fd.append("flag", "csvUpload"); 5 $.ajax({ 6 url : phpのurl, 7 type: "POST", 8 dataType: "json", 9 data: fd, 10 processData: false, 11 contentType: false 12 }) 13 .done(function(data){ 14 console.log(data); 15 }) 16 .fail(function(jqXHR){ 17 console.log(jqXHR); 18 }); 19})
php
1$res = array("status"=>"error","data"=>""); 2if($_REQUEST["flag"] == 'csvUpload') { 3 $tmp_name = $_FILES['file']['tmp_name']; 4 $fp = fopen($tmp_name, 'rb'); 5 6 $res["data"]["filecontents"] = file_get_contents($fp); 7 $res["data"]["filepath"] = $tmp_name; 8 9 // 処理中略, ファイル処理が成功すれば$res["status"] = "success" 10 11 header('Content-type: application/json'); 12 echo json_encode($res); 13 exit(); 14}
補足情報
php v7.0.31
jQuery v2.1.4
使用想定ブラウザ Chromeのみ
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/17 06:02 編集
2020/07/17 06:12
2020/07/17 06:22 編集
2020/07/17 06:51
2020/07/17 07:01
2020/07/20 01:56