質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

2590閲覧

jqueryのajax通信で送られてきたCSVをPHP側で見れない

zepp

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/07/17 04:00

編集2020/07/20 01:51

前提・実現したいこと

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のみ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まずは普通にpostして読めるかどうかを検証するのが先。
ファイルポインタで掴んでるのに、file_get_contentしているのはなぜでしょう?
csvファイルを読んでいるのにjsonを返そうとしているのもおかしいです

投稿2020/07/17 06:00

編集2020/07/17 06:02
yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/17 06:02 編集

$tmp_name = $_FILES['file']['tmp_name']; $fp = fopen($tmp_name, 'rb'); header('Content-type: application/json'); while(!feof($fp)){ echo $data=fread($fp,1024); } fclose($fp);
zepp

2020/07/17 06:12

> ファイルポインタで掴んでるのに、file_get_contentしているのはなぜでしょう? ああ…file_get_contentの第一引数はファイル名ですよね… 書き間違いに気づけました、ありがとうございます。 > csvファイルを読んでいるのにjsonを返そうとしているのもおかしいです なぜおかしいのでしょう?
yambejp

2020/07/17 06:22 編集

CSVはJSONではないですから・・・ CSVを受け取って表示するならヘッダは header('Content-Type: text/csv '); とか header('Content-Type: text/csv ;charset=xxxx'); とすべきです。
zepp

2020/07/17 06:51

PHPが受け取るのはCSVですけど、返すのは最終的にCSVじゃないので大丈夫ですー
yambejp

2020/07/17 07:01

つまりCSVをそのまま出力しようとしている命題が間違えているということですね? CSVを配列やオブジェクトに展開して、JSONエンコードして出力してください
zepp

2020/07/20 01:56

> 送られてきたCSVの中身を文字列ないし、fgetcsv()で扱えるようになりたいです。 命題これっすねー。 一応本文には書いてたんですが、タイトルと齟齬がありましたね。 修正してみました。 勘違いさせてしまって申し訳ありません。
guest

0

PHP は知らない自分がレスするのもなんですが・・・

CSV ファイルは期待通りに送信されてますか?

質問のコードに、

fd.append("file", $("#csvFile").prop("files")[0]);

とあって、これが CVS ファイルを append したつもりですか? ここが変だと思います。

質問に <input type="file" ... というコードがありますが、ユーザーがそれで送信するファイルを選択し、<button type="button" ... クリックで jQuery ajax を使ってアップロードするのですよね?

であれば、var fd = new FormData(document.querySelector("form")); で送信するファイルが含まれた FormData オブジェクトを取得できるので、それを jQuery ajax の data に設定すれば multipart/form-data 形式で送信されるはずです。

もちろん、form 要素の enctype 属性に "multipart/form-data" が設定されていなければなりませんが。

Fiddler を使って期待通り送信できているか調べてみてはいかがですか?

そのあたりの話は、別のスレッドの私の回答 https://teratail.com/questions/277964#reply-395868 に書きましたので見てください。

投稿2020/07/17 05:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zepp

2020/07/17 06:52

> これが CVS ファイルを append したつもりですか? ここが変だと思います。 CSVファイルは期待通りにappendされてました
退会済みユーザー

退会済みユーザー

2020/07/17 08:43

それは失礼しました。
guest

0

echo json_encode($res); exit();

の部分を

return json_encode($res);

としてはいかがでしょうか?

理由は以下の通りです。
jsファイル内の

.done(function(data){ console.log(data); })

dataajaxのポスト送信の返り値を表しています。
一方PHPファイルで使用されているechoreturnとは違い返り値を返すものではない(返り値はnullとなる)し、exit()を使用すると返り値自体がnullととなります。
よって、PHP側の返り値の値を返すreturnをPHPファイル内で使用することでjsファイルのdatanullにならないと思うからです。

参照
PHPドキュメント echo
PHPドキュメント exit

追記
自分が作成したこの回答はPHPのheader()の用途を完全に勘違いしたものでした。なのでこの回答は参考にしないでください。

投稿2020/07/17 05:18

編集2020/07/17 07:01
SanQ

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問