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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3562閲覧

android端末からCSVファイルをPHPにアップロード

karetama

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/01/14 22:56

前提・実現したいこと

android端末からCSVファイルをPHPに POSTしてファイルを保存したいのですが、うまくPHP側で受け取ることができていません。Wiresharkを使い通信を覗いたところandroi端末からPHP側のサーバには通信できていることがわかったので、受け取るkeyを設定していないからなのか?と考えております。

いろいろ調べてみるとリクエストボディの書き込みをしないといけないぽい事が分かったのですがどのように書けばいいかわかりません。JSON文字列とかもよくわかりません。

PHP側でやる場合はフォームの作成で
<input type="text" name="text1">
と書き
フォームの取得で

<?php echo($_POST['text1']); ?>

と書けばフォームから値がtaxt1に書き込まれ送信した際データが取得できるんですが android側でフォームの処理を行うにはどうすればよいのでしょうか。
keyは'uploaded_file'にしようと考えております。

発生している問題・エラーメッセージ

PHP

1Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 3 2 3Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 4 4エラーが発生しました。

該当のソースコード(1)

android(java)ファイル //androidにあるファイルをサーバにアップロードします public int uploadFile(final String selectedFilePath) { int serverResponseCode = 0; HttpURLConnection connection ; // DataOutputStream dataOutputStream ;//アプリケーションはプリミティブ型のJavaデータを移植性のある形で出力ストリームに書き込むことができます。アプリケーションはデータ入力ストリームを使ってデータを読み戻すことができます。 String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; File selectedFile = new File(selectedFilePath); String[] parts = selectedFilePath.split("/"); final String fileName = parts[parts.length - 1]; if (!selectedFile.isFile()) { dialog.dismiss(); runOnUiThread(new Runnable() { @Override public void run() { tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath); } }); return 0; } else { try { FileInputStream fileInputStream = new FileInputStream(selectedFile); //CSVデータをストリームに書き込むバイト数を取得 DataOutputStream dataOutputStream ; //アプリケーションはプリミティブ型の Java データを移植性のある形で出力ストリームに書き込むことができます URL url = new URL(SERVER_URL); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true);//入力を許可 connection.setDoOutput(true);//出力を許可する connection.setUseCaches(false);//キャッシュされたコピーを使用しないでください connection.setRequestMethod("POST"); connection.setRequestProperty("ENCTYPE", "multipart/form-data");//データをマルチパート形式で送信します(複数の種類のデータを持つ) connection.setRequestProperty("Connection", "Keep-Alive"); //コスト削減方法 connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);//ファイルの種類を表す情報が入ってるよ connection.setRequestProperty("uploaded_file", selectedFilePath); //新しいデータ出力ストリームの作成 dataOutputStream = new DataOutputStream(connection.getOutputStream()); //バイトをデータ出力ストリームに書き込む dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + selectedFilePath + "\"" + lineEnd); dataOutputStream.writeBytes(lineEnd); dataOutputStream.flush(); //コンピューターでデータを一時的に記憶する場所 bytesAvailable = fileInputStream.available(); //バッファサイズを使用可能な最小バイトまたは1 M​​Bとして選択 bufferSize = Math.min(bytesAvailable, maxBufferSize); // bufferSizeのサイズのバイト配列としてバッファを設定します buffer = new byte[bufferSize]; // FileInputStreamからバイトを読み取ります(バッファーの0番目のインデックスからbuffersizeまで) bytesRead = fileInputStream.read(buffer, 0, bufferSize); // bytesRead = -1になるまでループを繰り返します。つまり、読み取るバイトがなくなる while (bytesRead > 0) { //入力ストリームから読み取ったバイトを書き込みます dataOutputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } dataOutputStream.writeBytes(lineEnd); dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); //get.ResponsCode() HTTP 応答メッセージから状態コードを取得します serverResponseCode = connection.getResponseCode(); String serverResponseMessage = connection.getResponseMessage(); Log.i(TAG, "Server Response is: " + serverResponseMessage + ": " + serverResponseCode); //応答コード200は、サーバーステータスがOK if (serverResponseCode == 200) { runOnUiThread(new Runnable() { @Override public void run() { tvFileName.setText("ファイルの Upload が成功しました.\n\n 送信先 \n\n" + "http://192.168.2.117\n\n" + fileName); } }); } //入力ストリームと出力ストリームを閉じます fileInputStream.close(); dataOutputStream.flush(); dataOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "File Not Found", Toast.LENGTH_SHORT).show(); } }); } catch (MalformedURLException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "URL error!", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "Cannot Read/Write File!", Toast.LENGTH_SHORT).show(); } dialog.dismiss(); return serverResponseCode; } } }

該当のソースコード(2)

<?php $target_dir = "./upfile/"; $target_path = $target_dir . basename( $_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploaded_file']['name']). " アップロードができました"; } else{ echo "エラーが発生しました。"; } ?> ~

試したこと

wiresharkで通信を覗いたところ android端末と自サーバとの通信はできていた。

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

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

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

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

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

m.ts10806

2020/01/14 23:54

>Notice: Undefined index: uploaded_file このNoticeはどこでどのようにして得られたのでしょうか。
karetama

2020/01/15 00:22

質問ありがとうございます。android側からデータを送信した後、PCのほうで用意して置いたPHPのファイルを開くとそのようなエラーがおきていました。
m.ts10806

2020/01/15 00:27

それはそうなりますね。
karetama

2020/01/15 00:34

どのようにすればよいのでしょうか...質問攻めで申し訳ございません。
guest

回答1

0

ベストアンサー

android側からデータを送信した後、PCのほうで用意して置いたPHPのファイルを開くとそのようなエラーがおきていました。

androidでもWebViewのような形で直接画面遷移が発生しないものでしたら、それぞれは独立したアプリケーションです。
「PHPのファイルを開く」ということはあくまでURLをブラウザから実行したに過ぎず、「androidからのリクエスト」ではなく「実行したブラウザからのGETリクエスト」になります。

他の媒体からPHPなどを実行する場合はAPIとしての実行になります。
Androidの方に精通しているわけではありませんが、コードからHttpURLConnectionを確立し、リクエスト情報を設定し、URLに対して送信して、レスポンスを得ているように思います。

確認すべきはandroidに返ってきたレスポンス情報になります。
基本的にはPHP側で「出力」された情報が返ってきているはずです。
echoが書かれているのでそのechoは返ってきてると思います。
ファイルアップロードはジャッカン敷居が高いので、ひとまず何かしらの文字列を送信して、その文字列に別の文字列を追加して出力し、Android側でレスポンスを確認するところから始めてみてはいかがでしょうか。

投稿2020/01/15 00:44

m.ts10806

総合スコア80850

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

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

karetama

2020/01/15 01:47

直接画面遷移が発生していたら確かにPOSTして反映されますね... すごく分かりやすいです。ありがとうございます。そうなってくるとプログラムの全体的な話になってきますね..1つ1つこなしていこうと思います。ご回答ありがとうございました。
m.ts10806

2020/01/15 01:59

ちなみに考え方はAjaxと同じです。 PHP側は誰からリクエストがあるとかは知らない状態なので、送られたリクエストを受け取り、所定の処理をして、送られてきた元に返すだけとなります。
karetama

2020/01/15 02:12

quearyを送ってandroid端末であることをまず教える感じですかね...イメージが少しずつわいてきました。 ありがとうございます。
m.ts10806

2020/01/15 03:21 編集

いえ、特に要件にないのでしたら教える必要はないです。 どこからのアクセスが来たとかログとりたいときに端末情報をPOSTしてその情報を保存するように作ってください。 くり返しますがAPIは受け取ったリクエストを以て所定の処理を行い、送ってきた先に返すだけです。 先の「端末情報を~」もPHP側はどこからだれが送ったか知る術にはなりません。開発者側の都合で送って受け取ってるだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問