【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する 
2014/08/03 Sun [edit]
以前に、JSON (テキストデータ) を PHP から送信して、Java で受け取ることができたので、今回はそれと同じ考え方で、画像の送受信に置き換えてみる。わざわざ PHP を通してダウンロードしているわけだが、もちろん直接画像のURLにアクセスしてダウンロードしても構わない。PHP でダウンロードする利点はファイル名をデータベースなどに入れて置いて、同じURLで内容を入れ替えられる点だ。この方法なら、画像ファイルを直接アクセスできない場所に置いて、ファイル自体を隠蔽化することもできる。
クライアント側は Java にしたいので、とりあえず Android にする。画像のデコードはプラットフォームごとに異なるので、その部分だけ入れ替えれば、流用もできるだろう。
PHP のサンプルコードは超絶簡単なものにする。エラーなどはあまり考えてないので、必要なら適当に付け加えた方が良いだろう。とりあえずファイル名を「image_out.php」としておく。
■画像送信用 PHP(image_out.php)
<?php
$fileName = "img/sample.jpg"; //ファイル名
if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize($fileName)); //あった方が良い
readfile($fileName); //ファイルを読み込んで標準出力に書き出し
exit;
}
?>
header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。
このサンプルの場合は、画像ファイル名が固定されているので Content-type が固定されているが、データベースなどからファイル名を読み込んで、画像を切替える場合は、拡張子などで Content-type を切り替えるようにした方が良いだろう。
ちなみに png と gif の Content-type は、
header('Content-Type: image/png');
header('Content-Type: image/gif');
となる。また、Android では gif はサポート対象外なので、あまり使わない方が良いかも知れない。透過したい場合は png が良いだろう。
一緒に Content-Length も出力しているが、画像ファイルの場合はあった方が良い。ないと以下の Java コードで Content-Length = -1 (不明)となる。あらかじめファイルサイズを取得して、縮小してダウンロードするときなどには必要になるだろう。ちなみにテキストファイル(text/plain)の場合はコードを書かなくても、Content-Length は勝手に付いてくる(書いても問題ない)。
あとは、Android 側で画像の受信とデコードをする。以前の JSON 用コードとあまり変わらないので、目新しいものは無いかも知れない。また、Android の場合、マニフェストファイル(AndroidManifest.xml)にインターネット接続用のパーミッションが必要になる。
■インターネット接続用のパーミッション(AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
■画像受信用 Java (Android 用)
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 15 * 1000; //接続タイムアウト[ms]
String phpUrl = "http://(テストするサーバー)/image_out.php"; //画像送信用 PHPのURL
Bitmap bitmap = null; //受信した画像を入れる
try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setRequestMethod("GET");
con.connect();
bitmap = BitmapFactory.decodeStream(con.getInputStream()); //画像デコード
//確認用
System.out.println("con.getContentType() = " + con.getContentType());
System.out.println("con.getContentLength() = " + con.getContentLength());
System.out.println("con.getResponseCode() = " + con.getResponseCode());
System.out.println("con.getResponseMessage() = " + con.getResponseMessage());
con.disconnect();
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
// ・・・・
// onDraw() などで確認する場合
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
例外処理はかなり手抜きしてるので、必要に応じて適当に。サーバー接続タイムアウトを取得したいなら、catch 節に SocketTimeoutException を加えれば、捕えることができる。
URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。
また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良いだろう。Android なら Service や AsyncTask がよく使われているようだ。
(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【PHP】【Android】apk ファイルを PHP でダウンロードする
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/143-8798d2e0
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |