12

AndroidデバイスからRailsサーバーにhttppostメソッドを介して画像ファイルをアップロードしようとしています。しかし、画像の投稿は機能していません。具体的には、postパラメータ(画像ファイルを含む)が正しく送信されていないようです。

Android Asynchronous Http Client(http://loopj.com/android-async-http/)を使用してAndroidから画像を投稿していますが、画像を投稿するためのコードは次のようになっています。

public static void postImage(){
    RequestParams params = new RequestParams();
    params.put("picture[name]","MyPictureName");
    params.put("picture[image]",File(Environment.getExternalStorageDirectory().getPath() + "/Pictures/CameraApp/test.jpg"));
    AsyncHttpClient client = new AsyncHttpClient();
    client.post("http://x.x.x.x:3000/pictures/", params, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            Log.w("async", "success!!!!");
        }                                                                                                                                                                     
    }); 
}   

Railsのペーパークリップアプリケーションについては、足場を使用して「pictures」という名前のモデルを生成し、それにペーパークリップ添付ファイルを追加しました。モデルとコントローラー(リクエストを受信)は以下のようになります。

モデル

class Picture < ActiveRecord::Base                                                                                                                                            
  attr_accessible :name, :image
  has_attached_file :image,
                    :styles => { :original => "480x480>", :thumbnail => "100x100>" },
                    :path => ':rails_root/public/system/pictures/image/:id_partition/:style_:filename'
end

コントローラ

# POST /pictures                                                                                                                                                              
# POST /pictures.json
def create
  @picture = Picture.new(params[:picture])

  respond_to do |format|
    if @picture.save
      format.html { redirect_to @picture, notice: 'Picture was successfully created.' }
      format.json { render json: @picture, status: :created, location: @picture }
    else
      format.html { render action: "new" }
      format.json { render json: @picture.errors, status: :unprocessable_entity }
    end
  end
end

リクエストを受信すると、「railsserver」コンソールは次のように表示します

Started POST "/pictures/" for y.y.y.y at 2012-09-03 18:23:00 +0900
Processing by PicturesController#create as HTML
  Parameters: {"picture"=>{"name"=>"PictureName"}}
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "pictures" ("album_id", "created_at", "image_content_type", "image_file_name", "image_file_size", "image_updated_at", "name", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["album_id", nil], ["created_at", Mon, 03 Sep 2012 09:23:00 UTC +00:00], ["image_content_type", nil], ["image_file_name", nil], ["image_file_size", nil], ["image_updated_at", nil], ["name", "PictureName"], ["updated_at", Mon, 03 Sep 2012 09:23:00 UTC +00:00], ["user_id", nil]]
[paperclip] Saving attachments.
   (11.0ms)  commit transaction
Redirected to http://x.x.x.x:3000/pictures/10                                                                                                                               
Completed 302 Found in 15ms (ActiveRecord: 11.6ms)

ご覧のとおり、送信されるパラメータは1つだけで、生の画像データである「picture[image]」パラメータは受信されません。誰か助けてもらえますか?

4

3 に答える 3

12

すみません、それは私のばかげた間違いでした。やるべきだった

params.put("picture[image]", new File(Environment.getExternalStorageDirectory().getPath() + "/Pictures/CameraApp/test.jpg"));

いいえ

params.put("picture[image]", File(Environment.getExternalStorageDirectory().getPath() + "/Pictures/CameraApp/test.jpg"));

ファイルではなく新しいファイルを使用する必要があります

Android Asynchronous Http Client(http://loopj.com/android-async-http/)を使用する場合、MultipartEntityを気にする必要はありません。私の質問に答えてくれたすべての人に感謝します!!!!

于 2012-09-03T15:20:25.810 に答える
1

MultipartEntityを介して画像をアップロードできます。

MultipartEntity、HttpMime4.0以降の一部。境界文字列で区切られ、指定された文字セットを使用してエンコードされた複数の部分をhttppostリクエストに入れることができます。

マルチパートの詳細と使用方法については、これ これを参照してください。

于 2012-09-03T09:52:55.350 に答える
0

Android AsyncHttpClientの公式ページ(http://loopj.com/android-async-http/)に、以下のような説明があります。

「追加のサードパーティライブラリを使用しないマルチパートファイルのアップロード」

「RequestParamsを使用したファイルのアップロード」のセクションには、画像をアップロードするためのサンプルコードがあります。

File myFile = new File("/path/to/file.png");
RequestParams params = new RequestParams();
try {
    params.put("profile_picture", myFile);
} catch(FileNotFoundException e) {}

これは私がしたことですが、うまくいきませんでした。これは私の質問に答えるのに役立ちますか?

于 2012-09-03T10:44:08.657 に答える