android 画像アップロード rails
http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_image_controller/
http://qiita.com/shunjiro/items/92046bae8651ae8e2850
上記2つのページを参考に、android端末から画像をアップロードし、PC内に保存することを考えています。
1つ目のページにあるように、imgのパラメータとしてandroid側から画像をアップロードするにはどうすれば良いでしょうか?
railsのコード
def upload
file = params[:img]
File.open("public/img/kuro.png, 'wb') { |f|
f.write(file.read)
}
render nothing: true, status: 200
end
railsのコントローラで以上のようなアクションを作成し、androidからこのアクションをPOSTで呼び出し画像をアップロードしたいと考えています。
androidのコード
public static String sendPostRequest1(byte[] data) throws IOException {
// 接続先URL
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
HttpURLConnection con = null;
URL url = new URL("http // 接続先URL/application/upload");
con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
// リダイレクトを自動で許可しない設定
con.setInstanceFollowRedirects(false);
// URL接続からデータを読み取る場合はtrue
con.setDoInput(true);
// URL接続にデータを書き込む場合はtrue
con.setDoOutput(true);
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
con.setRequestProperty("Accept-Charset", "UTF-8");
con.setUseCaches(false);
DataOutputStream wr = new DataOutputStream(
con.getOutputStream());
wr.writeBytes(twoHyphens + boundary + lineEnd);
wr.writeBytes("Content-Disposition: form-data; name=\"filename\";" + lineEnd);
wr.writeBytes(lineEnd);
wr.writeBytes("kuro.png");
wr.writeBytes(lineEnd);
for(int i=0;i<data.length;i++) {
wr.write(data[i]);
}
wr.writeBytes(lineEnd);
wr.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
con.connect();
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();
wr.flush();
wr.close();
System.out.println("Done");
// Webサーバからの応答を表示する
String line1;
line1= displayResponse(con);
// HTTP接続を切断する
con.disconnect();
return line1;
}
android側から上記のようにアクションをコントローラを呼び出しました。
しかし、以下のように表示されpublic/img/kuro.pngというファイルは作成されましたが、なにもデータが入っていない状態です。
rails側の[img]に当たる部分をどのように記述すればよいのか、やり方が全く正しくないのかどなたかご教授ください。
コマンドプロンプトの表示
Started POST "/application/upload" for ******at 2017-06-08 15:22:42 +0900
Processing by ApplicationController#upload as HTML
Parameters: {"filename"=>"kuro.png\r\n"}
NoMethodError (undefined method `read' for nil:NilClass):
app/controllers/application_controller.rb:14:in `block in upload'
app/controllers/application_controller.rb:13:in `open'
app/controllers/application_controller.rb:13:in `upload'
Rendered E:/Ruby22/lib/ruby/gems/2.2.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.5ms)
Rendered E:/Ruby22/lib/ruby/gems/2.2.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms)
Rendered E:/Ruby22/lib/ruby/gems/2.2.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered E:/Ruby22/lib/ruby/gems/2.2.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (249.7ms)