- 締切済み
javaからphpへのファイルアップロードで困っています
クライアントからサーバへファイルをアップロードするJAVAプログラムを作成しているのですが、アップロードの処理が分からず困ってます。 処理の流れとしては、 HTML(クライアント)でファイルを指定し、 PHP(サーバ)でクライアントから指定されたファイルの受信処理を行う。 このHTML(クライアント)の部分をJAVAで作成しようと考えています。 HttpURLConnectionで接続までは作成できましたが、JAVAでHTMLの <input type="file" name="upfile"> の部分をどのようにコーディングするのか分かりません。 //PHP受信処理↓ $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed"); print($_FILES['upfile']['error']); print("<b>失敗</b>"); } else { print("<b> $filename </b> uploaded"); print("<b>成功</b>"); どなたかご存知の方がいらっしゃいましたら御教授お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 コネクションに設定している部分の con.setRequestPropertyを見比べてみてください。 ここが直れば動作すると思います。 あとは送信したいファイル形式等、調整すれば基本的にどんなファイルでも送信できると思います。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 確かにパラメータ名はname=imgの部分を変えればサーバ側でその名前で取得できるはずです。 ログについてはnoticeなので基本的には動いているはずです。 PHP側でprint_r ( $_FILES ); を入れてみてください。 Java側でレスポンスを受け取ってるところでPHPでの処理結果(配列内容)が表示されます。 その辺を見てみてください。
補足
ご連絡ありがとうございます。 実行してみましたが、失敗しております。 症状が変わりません。httpdのエラーログも変化無しの状態です。 ここまで親切に解説して頂いたのにお恥ずかしい限りです。 JAVAプログラム(クライアント側)↓ import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class httpup{ public static void main(String[] args){ String bnd = "abcdrghijklmnopqrstuvwxyzabcdefghijklmn"; HttpURLConnection con; URL url; OutputStream op; StringBuffer sb = new StringBuffer(); int wLength; try{ //対象ファイル FileInputStream inps = new FileInputStream("E:\\test.jpg"); //送信先 url = new URL("http://fedora/uploader.php"); con = (HttpURLConnection)url.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("Content-Type","multipart/form; boundary=" + bnd); sb.append("--"); sb.append(bnd); sb.append("\r\n"); op = con.getOutputStream(); op.write(sb.toString().getBytes()); op.write("Content-Disposition: form-data;".getBytes()); op.write("name=\"upfile\";".getBytes()); op.write("filename=\"test.jpg\"\r\n".getBytes()); op.write("Content-Type:image/pjpeg\r\n".getBytes()); op.write("\r\n".getBytes()); byte[] byteData = new byte[128]; while((wLength=inps.read(byteData)) != -1){ op.write(byteData, 0, wLength); } op.write("\r\n".getBytes()); sb.setLength(0); sb.append("--"); sb.append(bnd); sb.append("--"); op.write(sb.toString().getBytes()); inps.close(); op.close(); con.connect(); InputStream inputStream = con.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); int resChar; sb.setLength(0); while((resChar = isr.read()) != -1) { sb.append((char)resChar); } System.out.println(sb.toString()); // 応答コード&メッセージ System.err.println("【応答コード】 " + con.getResponseCode() + " " + con.getResponseMessage() ); inputStream.close(); con.disconnect(); } catch(Exception e){ e.printStackTrace(); } } } PHPプログラム(サーバ側)↓ <?php echo "FILE " , print_r ( $_FILES ); echo "UPFILE " , $_FILES["upfile"]["name"] , "<BR>"; echo "MIME " , $_FILES["upfile"]["type"] , "<BR>"; echo "FILESIZE" , $_FILES["upfile"]["size"] , "<BR>"; echo "TMPFILE " , $_FILES["upfile"]["tmp_name"] , "<BR>"; echo "ERRORCD " , $_FILES["upfile"]["error"] , "<BR>"; $updir = "/upfile/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed"); print($_FILES['upfile']['error']); print("<b>失敗</b>"); } else { print("<b> $filename </b> uploaded"); print("<b>成功</b>"); } ?> 実行結果eclipseコンソール↓ <html> <head><title>uploader.php</title></head> <body> <p> file uploader </p> FILE Array ( ) 1UPFILE <BR>MIME <BR>FILESIZE<BR>TMPFILE <BR>ERRORCD <BR>Upload failed<b>失敗</b></body> </html> 【応答コード】 200 OK HTMLファイル(クライアント)から サーバへアップロードした場合の結果↓ file uploader FILE Array ( [upfile] => Array ( [name] => test.jpg [type] => image/jpeg [tmp_name] => /tmp/phpu0Bjfe [error] => 0 [size] => 0 ) ) 1UPFILE test.jpg MIME image/jpeg FILESIZE0 TMPFILE /tmp/phpu0Bjfe ERRORCD 0 test.jpg uploaded成功
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 意図はわかりました。 Javaアプリ内でHttp通信を利用してバイナリデータを送信する感じでしょうか。 これをベースでカスタマイズすれば動くと思います。 (もっと良い方法があるかもしれませんが、これで通信出来ていることを確認しています) === // ここは可変にしたほうが良い String bnd = "abcdefghijklmnopqrstuvwxyzabcdefghijklmn"; HttpURLConnection con; URL url; OutputStream op; StringBuffer sb = new StringBuffer(); int wLength; try { // 送信対象のファイル FileInputStream inps = new FileInputStream ( "d:\\develop\\test.jpg" ); // 送信先 url = new URL ( "http://test/test.php" ); con=(HttpURLConnection) url.openConnection(); con.setRequestMethod ( "POST" ); con.setDoOutput ( true ); con.setRequestProperty ( "Content-Type", "multipart/form-data; boundary=" + bnd ); sb.append ( "--" ); sb.append ( bnd ); sb.append ( "\r\n" ); op = con.getOutputStream(); op.write ( sb.toString().getBytes() ); op.write ( "Content-Disposition: form-data;".getBytes() ); op.write ( "name=\"img\";".getBytes() ); op.write ( "filename=upload.jpg\r\n".getBytes() ); op.write ( "Content-Type: image/pjpeg\r\n".getBytes() ); op.write ( "\r\n".getBytes() ); byte[] byteData = new byte[128]; while ( (wLength=inps.read(byteData)) != -1 ) { op.write ( byteData, 0, wLength ); } op.write ( "\r\n".getBytes() ); sb.setLength ( 0 ); sb.append ( "--" ); sb.append ( bnd ); sb.append ( "--" ); op.write ( sb.toString().getBytes() ); inps.close(); op.close(); con.connect(); InputStream inputStream = con.getInputStream(); InputStreamReader isr = new InputStreamReader ( inputStream ); int resChar; sb.setLength ( 0 ); while ( (resChar = isr.read()) != -1 ) { sb.append ( (char)resChar ); } System.out.println ( sb.toString() ); inputStream.close(); con.disconnect(); } catch ( Exception e ) { e.printStackTrace(); } ===
補足
ご連絡ありがとうございます。 >Javaアプリ内でHttp通信を利用してバイナリデータを送信する感じでしょうか。 その通りです。こちらの意図を理解して頂き、ありがたいです。 サンプルソースまで載せて頂き、大変感謝しております。 載せて頂いたサンプルを使用しURL、アップロードするファイルを変更する等して、実行してみましたが未だにうまくいっておりません。 httpdのエラーログを見ると↓ PHP Notice: Undefined index: upfile in /var/www/html/uploader.php on line ** が多数出力されています。 (**の行番はPHPの$_FILES["upfile"]を記述している部分) おそらく、リクエストを受け取るPHPの各$_FILES["upfile"]の中に値が 入っていないからだと思いますが、JAVAプログラムのどの部分が原因で、どのように変更すればよいか分かりません。 自分としては下記の部分だと思い、 op.write ( "Content-Disposition: form-data;".getBytes() ); op.write ( "name=\"img\";".getBytes() ); op.write ( "filename=upload.jpg\r\n".getBytes() ); op.write ( "Content-Type: image/pjpeg\r\n".getBytes() ); の部分を変更(name=upfile等)に変更して実行してみましたが、同じエラーになります。 ご親切にサンプルまで頂いた上で大変恐縮なんですが、御教授お願いします。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 HTMLの部分をJavaでとはどのような仕様をお考えでしょうか。 (Javaアプレットを使う?画面はあくまでHTML?)
補足
ご連絡ありがとうございます。 仕様としては、アプレットやHTMLを使用せずに バッチファイルからJAVAプログラムを呼び出して実行しようと考えています。 アップロードするファイル名、URLはプロパティファイルから読み込んで、実行させます。 検討違いかもしれませんが、 "Content-Disposition: form-data; name=upfile; filename=ファイル名" を指定すればアップロードできるのではないかと思い、実行してみましたが駄目でした。 アプレットで作成しないと実現できないんでしょうか?御教授お願いします。
お礼
長々とお付き合い下さり有難うございます。 >con.setRequestPropertyを見比べてみてください "-data"が抜けてましたね。原因が初歩的なミスだった事が大変恥ずかしいです。改めて注意力不足及び、スキル不足を痛感致しました。 ソース修正後、特にエラーもなく無事アップロードできる事を確認しました。 今回の御教授、大変勉強になりました。このプログラムを元に、様々な状況に対応できるよう、カスタマイズしたいと思います。 本当に有難う御座いました。