結構ハマる内容なのでメモしました
画像のアップロードで、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