2010-04-03 14 views
2

Mon problème est que j'essaye de télécharger une image et quelques valeurs de texte à un serveur de rails, et les valeurs de texte finissent en tant que fichiers, insted de valeurs de param juste.android/rails problème de téléchargement multipart

Comment le poste regarde sur le serveur

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

partie du code Android

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 { 

} 
+0

moi aussi face au même problème .. avez-vous trouvé une solution à ce problème ... – Dinash

Répondre

1

C'est juste la façon Rails fait des données de formulaire multipart.

Pour plus de commodité, j'ajouté ce before_filter dans mon 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 

qui parse chaque partie dans un hachage JSON.