2012-07-09 13 views
5

Tengo una aplicación construida en ruby ​​on rails. Necesito publicar una solicitud de curl a esa aplicación para cargar imágenes desde la máquina local. En mi aplicación ruby ​​on rails, estoy usando paperclip para cargar imágenes.Curl solicitud para cargar imágenes desde la máquina local a la aplicación Ruby on Rails

Ahora esta solicitud rizo está trabajando perfectamente bien, ya que es la imagen sin carga para esta solicitud rizo:

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 

Ahora quiero subir una imagen de mi localmachine.

Adición "display_photo": @ test.jpg no está funcionando: Esto es lo que estaba tratando: (. Pero no su trabajo)

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 

Así que la pregunta es cómo cargar imágenes/datos archivos/vídeos de solicitud de rizo

EDIT

Ésta es mi controlador:

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 

En mi modelo:

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

¿quieres subir tu foto en línea ?! – phoet

+0

@phoet ¿en línea qué? es una solicitud para actualizar su perfil. Quiero actualizar la imagen de perfil del usuario. –

+0

sí, pero estás tratando de poner un archivo de tu máquina local en una cadena json. o no entiendo bien tu comando Curl? – phoet

Respuesta

13

que normalmente cargar un archivo de la siguiente manera:

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

Si lo hace, imita el comportamiento que tendría una carga de archivos a través de navegadores web.

si nos fijamos en la respuesta de los carriles para esto, se envía a través de application/octet-stream que se puede manejar correctamente como un archivo cargado. Por lo que yo sé que no es posible hacer esto con una solicitud 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

eche un vistazo a mi parte de edición. Así es como estoy aceptando mis solicitudes. He eliminado la verificación api_token del código. ¿Cómo puede ayudarme a pasar atributos como first_name, last_name y una imagen de visualización con solo una llamada? –

+0

eche un vistazo a este ejemplo http://leejava.wordpress.com/2009/07/30/upload-file-from-rest-in-ruy-on-rail-with-json-format/ – phoet

+0

Tenga en cuenta " filedata "parte es el nombre de la carga real del archivo que es lo que usará para hacer referencia en el lado del servidor. – cevaris

6

que tenían el mismo problema y lo resolvió con lo siguiente, que evitan la solicitud 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

Considere la posibilidad de editar su publicación para agregar más explicaciones sobre lo que hace su código y por qué resolverá el problema. Una respuesta que solo contenga código (incluso si funciona) generalmente no ayudará al OP a entender su problema. – Drenmi

Cuestiones relacionadas