LoginSignup
14
15

More than 5 years have passed since last update.

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

Posted at

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

画像のアップロードで、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

14
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15