2012-07-09 11 views
5

Mam aplikację zbudowaną w rubinach na szynach. Muszę przesłać prośbę o zwijanie do tej aplikacji, aby przesłać obrazy z lokalnego komputera. W aplikacji "Ruby on rails" używam spinacza do przesyłania zdjęć.Żądanie zwinięcia do przesłania obrazu z komputera lokalnego do aplikacji Ruby on Rails

Teraz to curl żądanie działa perfekcyjnie, gdyż nie ma w tym przesyłanie obrazu curl żądanie:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"John","last_name":"Smith"},"token":"api"}' http://localhost:3000/users/8 

Teraz chcę przesłać obraz z mojego localmachine.

Dodanie "display_photo": @ test.jpg nie działa: To, co starałem: (. Ale jej nie działa)

curl -v -H -F "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"firstname","last_name":"lastname","display_photo":@test.jpg},"token":"api"}' http://localhost:3000/users/8 

Więc pytanie brzmi, jak przesłać obrazy/dane plików/filmów z żądania curl

EDIT

to jest mój kontroler:

def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to(@user, :notice => 'User was successfully updated.') } 
     format.json { render :file => "users/json/show.json.erb", :content_type => 'application/json' } 
     else 
     format.html { render :action => "edit" } 
     format.json { 
      @errors_object = @user 
      render :file => "shared/json/errors.json.erb", :content_type => 'application/json' } 
     end 
    end 
    end 

W moim modelu:

class User < ActiveRecord::Base 
    has_attached_file :display_photo, :styles => { :medium => "200x200#", :thumb => "100x100#", :very_small=>"24x24#" } 
end 
+0

Czy chcesz przesłać swoje zdjęcie w trybie offline ?! – phoet

+0

@phoet inline what? to prośba o aktualizację twojego profilu. Chcę zaktualizować obraz profilu użytkownika. –

+0

tak, ale próbujesz umieścić plik z komputera lokalnego w łańcuchu json. czy źle rozumiem twoje polecenie curl? – phoet

Odpowiedz

13

normalnie można przesłać plik tak:

curl -i -F [email protected] http://localhost:5000/ 

robi więc naśladuje zachowanie, które można mieć za pośrednictwem przesłania pliku webbrowsers.

Jeśli spojrzysz na odpowiedź na to pytanie, zostanie ono wysłane przez application/octet-stream, które może być traktowane poprawnie jako przesłany plik. o ile wiem, to nie jest możliwe, aby to zrobić z prośbą json:

Started POST "/" for 127.0.0.1 at 2012-07-10 09:40:59 +0200 
Processing by HomeController#index as */* 
    Parameters: {"filedata"=>#<ActionDispatch::Http::UploadedFile:0x007f82d59a3580 @original_filename="upload.txt", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"filedata\"; filename=\"upload.txt\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/f_/wjnrg7cd3d9f1tpy3k5fhrwm0000gn/T/RackMultipart20120710-30471-1t9abns>>} 
+0

spójrz na moją część do edycji. Oto, w jaki sposób akceptuję moje prośby. Usunąłem sprawdzanie api_token z kodu. W jaki sposób możesz pomóc mi w przekazywaniu atrybutów takich jak first_name, last_name i obraz wyświetlany przy użyciu tylko jednego połączenia. –

+0

spójrz na ten przykład http://leejava.wordpress.com/2009/07/30/upload-file-from-rest-in-ruy-on-rail-with-json-format/ – phoet

+0

Pamiętaj " filedata "część to nazwa rzeczywistego przesyłania plików, której będziesz używał do odniesienia po stronie serwera. – cevaris

6

miałem ten sam problem i rozwiązać go z następujących, które ominąć żądania JSON:

curl -v -H 'Content-Type: multipart/form-data' -H 'Accept: application/json' -H 'x-api-key:myapikey' -F "user[first_name]=firstname" -F "user[last_name]=lastname" -F "user[display_photo][email protected]" http://localhost:3000/users/8 
0
curl -v -include --form "<param>[email protected]/<root>/image_name.png" http://<your url> 
**<param>**: The image parameter of the url; 
**<root>**: You can use pwd get image root; 
**<your url>**: Post url; 
+0

Proszę rozważyć edycję swojego wpisu, aby dodać więcej wyjaśnień na temat tego, co robi twój kod i dlaczego to rozwiąże problem. Odpowiedź, która najczęściej zawiera kod (nawet jeśli działa) zazwyczaj nie pomoże OP zrozumieć ich problemu. – Drenmi