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

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

解決済

2回答

5066閲覧

android端末からファイルをサーバ(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クリップ

投稿2019/12/04 05:12

編集2019/12/04 06:34

前提・実現したいこと

android端末からファイルをサーバ(PHP)にアップロードし、PHP側でアップロードファイルを受け取りそれを作成したディレクトリの中に入れる。

android端末からファイルをサーバ(PHP)にアップロードには成功しているのですが
ファイルが PHP によるサーバー側の受け口に送られていなく困っています。

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

PHP側では Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 4 Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 5 エラーが発生しました。 というエラーがでており、 調べてみると(未定義の配列の要素を使用した時に出るエラー)と書かれていました。 android側のプログラムはエラーなく動作しています。

該当のソースコード

android側(MainActivity.java)

//androidにあるファイルをサーバにアップロードします public int uploadFile(final String selectedFilePath) { int serverResponseCode = 0; HttpURLConnection connection =null; DataOutputStream dataOutputStream =null;//アプリケーションはプリミティブ型の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データをストリームに書き込みマス 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(); //mizuno追項目 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/UploadToServer.php\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; } } }
UploadToServer.php ?php $uploaded_file = isset($_FILES["uploaded_file"])?$_FILES["uploaded_file"]:NULL; $target_dir = '/savefiles'; $target_path = $target_dir.basename($_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$target_dir)) { echo " has been uploaded"; }else{ echo "エラーが発生しました。"; } ?>

試したこと

PHP側でエラーが出ているからうまくファイルが受け取れてないのか
それとも、Androidのプログラムの方が間違っているのか

とにかく送られていない原因が知りたい

補足情報(FW/ツールのバージョンなど)

Android studio
ここにより詳細な情報を記載してください。

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

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

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

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

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

tanat

2019/12/04 05:34

エラーメッセージは編集せずにそのまま全文を記載してください。
XNXSXMXR

2019/12/04 05:35

ブラウザでやってみると、$_FILE['uploaded_file'] は存在するでしょうか?
karetama

2019/12/04 06:32

Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 4 Notice: Undefined index: uploaded_file in /var/www/html/UploadToServer.php on line 5 エラーが発生しました。 編集致しました。
karetama

2019/12/04 06:37

$_FILE['uploaded_file']の中に送られてきたファイルが入るイメージで間違っていなければ、存在してません....
XNXSXMXR

2019/12/04 06:47

ブラウザでファイルアップロードをやってみたときのコードも載せていただけますか。
karetama

2019/12/05 06:23

返信が遅れて申し訳ございません。昨日いろいろな方法で確認したところ、PHP側では問題なく動いておりました。android側からパケットが送られていないか確認したところ通信はできていましたが中身が送られていなかったのでandroid側のコードに問題があるとわかりました。
guest

回答2

0

PHP側でエラーが出ているからうまくファイルが受け取れてないのか
それとも、Androidのプログラムの方が間違っているのか

とにかく送られていない原因が知りたい

  1. まずは、PHPの動いているサーバにファイルアップロードが出来るHTMLのフォームを置いて、ブラウザからファイルのアップロードを試してみる(PHP ファイルアップロードあたりで検索すると、PHP側とHTMLがセットで見つかります)
  • 1が成功するならPHP側には問題無いことがわかる
  • 1が成功しないなら、少なくともPHP側にミスがあるので、まずはPHP側を修正する。HTML+PHPでアップロードできる様になっても動かないなら、Android側で修正が必要と判断できる

という感じでまずはPHP側の問題なのかAndroid側の問題なのか切り分けてみることをお勧めします。

投稿2019/12/04 05:33

編集2019/12/04 07:09
tanat

総合スコア18713

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

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

karetama

2019/12/05 06:24

ご回答ありがとうございます。1が成功したのでandroid側に問題があることがわかりました。ありがとうございます。
guest

0

ベストアンサー

PHP側はいくつか不具合がありましたが、エラーの内容とは異なる部分でした。
Android側でHTTPヘッダが正しく設定されていないのかもしれないので、PHPに送信されたHTTPヘッダを確認してみてください。

error_log(var_export($_SERVER, true));

<?php $target_dir = '/savefiles/'; // ディレクトリの区切りが抜けています $target_path = $target_dir.basename($_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path)) // $target_dir -> $target_path { echo " has been uploaded"; }else{ echo "エラーが発生しました。"; }

投稿2019/12/04 12:18

tiechel

総合スコア43

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

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

tiechel

2019/12/04 15:54 編集

あと、HTTPのボディに問題がある場合はこれで確認できるので試してみてください。 `file_get_contents('php://input');`
karetama

2019/12/05 06:26

コードの修正ありがとうございます。android側にも問題箇所が見つけられたので引き続き頑張りたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問