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

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

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

```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>
```


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


```php: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と同じように送ってくれればいいよ。とか言われる

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


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



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

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

バイトコードをゲット

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

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

##　２、HttpURLConnection を準備

```java: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の設定。これが抜けてるとダメ。


##　３、DataOutputStream  を準備

```java: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で任意のデータは察してください。
さっき作ったバイトを突っ込んでいます。

##　４、送る

```java: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();
```

これで送れた。完成

##　５、作ってみて

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


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

```java: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