Help us understand the problem. What is going on with this article?

Androidで画像をアップロードする

More than 3 years have passed since last update.

結構ハマる内容なのでメモしました

画像のアップロードで、HTMLだと

upload.html
<html>
<body>
<form action="./upload.php" method="POST" enctype="multipart/form-data">
  <input type="file" name="upfile">
  <input type="submit" value="ファイルをアップロードする">
</form>
</body>
</html>

というようなソースコードで画像を参照しておくれば

upload.php
<?php

if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {
 chmod("files/" . $_FILES["upfile"]["name"], 0644);
 echo $_FILES["upfile"]["name"] . "をアップロードしました!!!";
}
}else {
echo "ファイルが選択されていません。";
}
?>

みたいのでアップできる。

ここのupload.phpにandroidで画像を送ってくれってしれっといわれる。
htmlと同じように送ってくれればいいよ。とか言われる

で、カンタンにできなくて、泣く。

なのでメモをしました
いろいろ調べて作ったので、元ネタどっか行ってしまった。ごめんなさい。

 1、バイトコードに変更が必要

upload.java
byte[] byteArray;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byteArray = byteArrayOutputStream.toByteArray();

バイトコードをゲット

※下記より定数を使います

upload.java
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary =  "*****";

 2、HttpURLConnection を準備

upload.java
HttpURLConnection con = null;
URL url = new URL(_url);
con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
con.setRequestProperty("Accept-Charset", "UTF-8");
con.setUseCaches(false);

ポイントとしてはContent-Typeの設定。これが抜けてるとダメ。

 3、DataOutputStream を準備

upload.java
DataOutputStream  outputStream = new DataOutputStream( con.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"filename\";" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes("fff.png");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"upfile\";filename=\"upfile.png\"" + lineEnd);
outputStream.writeBytes(lineEnd);
for(int i =  0 ; i < byteArray.length;i++){
                outputStream.writeByte(byteArray[i]);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
con.connect();

ここは、htmlで送ってるデータを見ると、なんとなく似た形でデータを送ってるのが分かる。
name とか filenameで任意のデータは察してください。
さっき作ったバイトを突っ込んでいます。

 4、送る

upload.java
InputStream in = con.getInputStream();
InputStreamReader objReader = new InputStreamReader(in);
BufferedReader objBuf = new BufferedReader(objReader);
StringBuilder objStr = new StringBuilder();
String sLine;
while ((sLine = objBuf.readLine()) != null) {
                objStr.append(sLine);
}
//objStr.toString();//返り値
in.close();
objBuf.close();

これで送れた。完成

 5、作ってみて

面倒くさいけど、htmlで遅れてるから受け口作れてるよっていうサーバーサイドの作り方された時に、適格な返しができなくて作る羽目になったり、むしろ、上記のプログラムで「こっちはできてるぜ。」って感じの対応も可能

 追記:BASE64エンコードしておくればいい場合

upload.java
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byteArray = byteArrayOutputStream.toByteArray();
ConvertImageStr = Base64.encodeToString(byteArray, Base64.DEFAULT);

でConvertImageStrの値をpostでimg=みたいにしておくればOK

shunjiro
ややという会社でいろいろやっています
http://yaya.tokyo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away