문제

My problem is that I try to upload an image and some text values to an rails server, and the text values end up as files, insted of just param values.

How the post looks on the server

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>}}

part of the android code

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 {

 }
도움이 되었습니까?

해결책

That's just the way Rails does multipart form data.

For convenience I added this before_filter in my ApplicationController:

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

which parses each part into a JSON hash.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top