将图像从 Android(使用 Android 异步 Http 客户端)上传到 rails 服务器(使用回形针)

Posted

技术标签:

【中文标题】将图像从 Android(使用 Android 异步 Http 客户端)上传到 rails 服务器(使用回形针)【英文标题】:Uploading an image from Android (with Android Asynchronous Http Client) to rails server (with paperclip) 【发布时间】:2012-09-03 09:46:50 【问题描述】:

我正在尝试通过 http post 方法将图像文件从 android 设备上传到 rails 服务器。 但是发布图像不起作用。更具体地说,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回形针应用,我只是简单地使用了脚手架和生成的名为“图片”的模型,并在其上添加了回形针附件。模型和控制器(接收请求)如下所示。

型号

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

当收到请求时,“rails server”控制台会说如下内容

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)

如您所见,仅发送了一个参数,并且未接收到原始图像数据“picture[image]”参数。谁能帮帮我?

【问题讨论】:

谢谢。我正在寻找类似的问题。 我得到 "status":"Error","error":"image_content_type":["is invalid"],"image":["is invalid"]。以前有人遇到过这个问题吗? 【参考方案1】:

对不起,那是我的愚蠢错误。 我应该做的

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。 感谢所有回答我问题的人!!!!

【讨论】:

我在我的应用程序中编写了相同的代码,但是由于图像尺寸很大,服务器多次给我错误,你知道有什么方法可以将大图像发送到服务器【参考方案2】:

您可以通过 MultipartEntity 上传图片。

MultipartEntity,HttpMime 4.0 及更高版本的一部分。允许您将多个部分(由边界字符串分隔并使用给定字符集编码)放入 httppost 请求中。

有关更多信息以及如何使用 Multipart,请参阅 this 和 this

【讨论】:

请查看我在答案中添加的另一个链接。 非常感谢您的回答!!!现在,我理解了使用 MultipartEntity,通过实例化 MultipartEntity 并在其上应用 addPart 方法,然后将 setEntity 方法调用到 HttpPost 实例。但我使用的不是 HttpPost 类,而是 AsyncHttpClient 类。你能告诉我如何在 AsyncHttpClient 上做同样的事情吗? 啊……抱歉,你知道如何在 AsyncHttpClient 上做同样的事情(使用 MultipartEntity)吗?【参考方案3】:

在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) 

这就是我所做的,虽然没有奏效。这有助于回答我的问题吗?

【讨论】:

嗨 Ryo,你的问题得到答案了吗?

以上是关于将图像从 Android(使用 Android 异步 Http 客户端)上传到 rails 服务器(使用回形针)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asynctask 将图像从 android 上传到 php

Android将图像从图库上传到服务器[关闭]

Android - 将图像从 URL 保存到 SD 卡

想将图像从 android 发布到 WCF 休息服务

将图像从 android 上传到 PHP 服务器

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)