2

我的问题是我尝试将图像和一些文本值上传到 Rails 服务器,文本值最终作为文件,仅包含参数值。

帖子在服务器上的外观

Parameters: {"action"=>"create", "controller"=>"problems",
"problem"=>{"lon"=>#File:/tmp/RackMultipart20100404-598-8pi1vj-0>, 
"photos_attributes"=>{"0"=>{"image"=>#File:/tmp/RackMultipart20100404-598-pak6jk-0>}}, 
"subject"=>#File:/tmp/RackMultipart20100404-598-nje11p-0>, 
"category_id"=>#File:/tmp/RackMultipart20100404-598-ijy1oo-0>, 
"lat"=>#File:/tmp/RackMultipart20100404-598-1a7140w-0>, 
"email"=>#File:/tmp/RackMultipart20100404-598-1b7w6jp-0>}}

部分安卓代码

try {
   File file = new File(Environment.getExternalStorageDirectory(),"FMS_photo.jpg");

   HttpClient client = new DefaultHttpClient();  
   HttpPost post = new HttpPost("http://homepage.com/path");  
   FileBody bin = new FileBody(file);  


   Charset chars = Charset.forName("UTF-8");

   MultipartEntity reqEntity = new MultipartEntity();  
   reqEntity.addPart("problem[photos_attributes][0][image]", bin);  
   reqEntity.addPart("problem[category_id]", new StringBody("17", chars));

   post.setEntity(reqEntity); 
   HttpResponse response = client.execute(post);  

   HttpEntity resEntity = response.getEntity();  
   if (resEntity != null) {    
     resEntity.consumeContent();  
  }

   return true;

  } catch (Exception ex) {

    globalStatus = UPLOAD_ERROR;
    serverResponse = "";
    return false;
  } finally {

 }
4

1 回答 1

1

这正是 Rails 处理多部分表单数据的方式。

为方便起见,我在 ApplicationController 中添加了这个 before_filter:

def read_and_parse_json_file_params
  file_params = params.select { |name,value| value.is_a?(File) || value.is_a?(Tempfile) }
  file_params.reject! { |name,file| file.content_type !~ %r{^application/json} }

  file_params.each do |name,file|
    file.rewind
    params[name] = ActiveSupport::JSON.decode(file.read)
  end
end

它将每个部分解析为 JSON 哈希。

于 2011-02-26T03:25:07.227 回答