35829
<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)
    
```
CC BY-SA 3.0
2017-06-16T05:38:26.460
35631
2017-06-23T03:02:29.193
2017-06-21T06:45:20.490
20272
23834
question
android ruby-on-rails
android　画像アップロード　rails
```

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

参考にされた記事の元のコードと比べて、2つめのパートのヘッダを送信するコードが消えてますね。

いきなりプログラムでやると大変なので、HTMLフォームやcurlを使った送受信から始め、そのときにどのような形式でどのようなデータが飛んでいるかを理解した方がよいでしょう。
CC BY-SA 3.0
2017-06-23T03:02:29.193
35829
2017-06-23T03:02:29.193
5793
35631
answer