2012-09-03 10 views
12

Sto tentando di caricare un file di immagine tramite il metodo http post dal dispositivo Android al server di rails. Ma pubblicare un'immagine non funziona. Più specificamente, il parametro post (incluso il file immagine) non sembra essere inviato correttamente.Caricamento di un'immagine da Android (con Android Asynchronous Http Client) al server di rails (con graffetta)

Sto usando Android Asynchronous Http Client (http://loopj.com/android-async-http/) per pubblicare un'immagine da Android, e il codice per postare l'immagine è come questo.

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!!!!"); 
     }                                          
    }); 
} 

Per quanto riguarda le rotaie graffetta applicazione, ho semplicemente usato scaffold e modello generato il nome di "immagini" e ha aggiunto file allegato graffetta su di esso. Modello e controller (che riceve la richiesta) è come sotto.

modello

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 

regolatore

# 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 

Quando si riceve la richiesta, "guide del server" console dice qualcosa del tipo seguente

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) 

Come si può vedere, c'è solo un paramater inviato e il parametro "immagine [immagine]" che non sono i dati di immagine grezza ricevuti. Qualcuno può aiutarmi?

+1

Grazie. Stavo cercando una domanda simile. –

+0

Ottengo {"stato": "Errore", "errore": {"image_content_type": ["non valido"], "immagine": ["non valido"]}}. Qualcuno ha avuto questo problema prima? –

risposta

12

Scusa, questo è stato il mio stupido errore. avrei dovuto fare

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

non

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

Dovranno utilizzare nuovo file non file

Quando si utilizza Android asincrono client HTTP (http://loopj.com/android-async-http/), non abbiamo a cuore MultipartEntity. Grazie a tutti i ragazzi che hanno risposto alla mia domanda !!!!

+0

Scrivo lo stesso codice nella mia applicazione, ma molte volte il server mi dà un errore perché la dimensione dell'immagine è grande, conosci qualche modo per inviare un'immagine grande al server –

1

È possibile caricare le immagini tramite MultipartEntity.

MultipartEntity, parte di HttpMime 4.0 e successive. Consente di inserire più parti, separate da stringhe di delimitazione e codificate utilizzando un determinato set di caratteri, nella richiesta httppost.

Per ulteriori informazioni e modalità di utilizzo Multipart, vedere thise this.

+0

Si prega di vedere un altro link che ho aggiunto nella mia risposta. – Shrikant

+0

Grazie mille per la tua risposta !!! Ora, capisco l'utilizzo di MultipartEntity, instanzando MultipartEntity e applicando il metodo addPart su di esso, quindi invoco il metodo setEntity all'istanza HttpPost. Ma quello che sto usando non è la classe HttpPost, ma la classe AsyncHttpClient. Potresti dirmi come fare lo stesso su AsyncHttpClient? – Ryo

+0

Ahhh ... mi dispiace, Sai come fare lo stesso (usa MultipartEntity) su AsyncHttpClient? – Ryo

0

C'è una descrizione come qui di seguito, nella pagina ufficiale AsyncHttpClient Android (http://loopj.com/android-async-http/)

"upload di file più parti senza ulteriori librerie di terze parti"

e nella sezione di "caricare i file con RequestParams", hanno un codice di esempio per caricare un'immagine

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

Questo è quello che ho fatto, anche se non ha funzionato. Questo aiuta a rispondere alla mia domanda?

+1

ciao Ryo, hai ottenuto la risposta alla tua domanda? –

Problemi correlati