Pregunta

Simplemente quiero subir una imagen a un servidor con POST. Tan simple como suena esta tarea, no parece haber ninguna solución sencilla en Ruby.

En mi solicitud estoy usando WWW :: Mecanizar para la mayoría de las cosas, así que quería utilizarlo para este también, y tenía una fuente de la siguiente manera:

f = File.new(filename, File::RDWR)
reply = agent.post(
    'http://rest-test.heroku.com',
    {
         :pict       =>  f,
         :function   =>  'picture2',
         :username   =>  @username,
         :password   =>  @password,
         :pict_to    =>  0,
         :pict_type  =>  0
    }
)
f.close

Esto se traduce en un archivo de basura totalmente listo en el servidor que se ve revuelto todo:

  

texto alternativo http://imagehub.org/f/1tk8/garbage.png

Mi siguiente paso fue rebajar WWW :: Mecanizar a la versión 0.8.5. Esto funcionó hasta que probé para ejecutarlo, lo que ha fallado con un error como "módulo no se encuentra en hpricot_scan.so". Con la herramienta Dependency Walker pude descubrir que necesita hpricot_scan.so msvcrt-ruby18.dll. Sin embargo, después de que puse .dll en mi carpeta bin-Rubí / me dio un cuadro de error vacía desde donde el no podía depurar mucho más. Así que el problema aquí es que Mechanize 0.8.5 tiene una dependencia en lugar de hpricot Nokogiri (que funciona a la perfección).


La siguiente idea era utilizar una joya diferente, por lo que trató de usar Net :: HTTP. Después de una investigación corta que pude encontrar que no hay soporte nativo para formularios de varios ejemplares de Net :: HTTP y en lugar de tener que construir una clase que codifica etc para usted. El más útil que pude encontrar fue el multiparte clase de Stanislav Vitvitskiy . Esta clase se veía bien hasta ahora, pero no hace lo que necesito, porque yo no quiero publicar solamente archivos, también quiero para publicar los datos normales, y que no es posible con su clase .


Mi último intento fue usar RESTClient . Esto parecía prometedor, ya que ha habido ejemplos sobre cómo cargar archivos. Sin embargo, no puedo conseguirlo para enviar el formulario como de varias partes.

f = File.new(filename, File::RDWR)
reply = RestClient.post(
    'http://rest-test.heroku.com',
    :pict       =>  f,
    :function   =>  'picture2',
    :username   =>  @username,
    :password   =>  @password,
    :pict_to    =>  0,
    :pict_type  =>  0
)
f.close

Estoy utilizando http://rest-test.heroku.com que envía de vuelta a la solicitud depurar si se envía correctamente, y siempre me sale esto de nuevo:

POST http://rest-test.heroku.com/ with a 101 byte payload,
content type application/x-www-form-urlencoded
{
    "pict" => "#<File:0x30d30c4>",
    "username" => "s1kx",
    "pict_to" => "0",
    "function" => "picture2",
    "pict_type" => "0",
    "password" => "password"
}

Esto muestra claramente que no utiliza multipart/form-data como de tipo de contenido, pero el application/x-www-form-urlencoded estándar, aunque sin duda ve que pict es un archivo.


¿Cómo puedo subir un archivo en Ruby a un impreso de varias copias sin implementar toda la codificación de datos y alinear a mí mismo?

¿Fue útil?

Solución

Long problema, respuesta corta:. Me faltaba el modo binario para la lectura de la imagen en Windows

f = File.new(filename, File::RDWR)

tuvo que ser

f = File.new(filename, "rb")

Otros consejos

Otro método es utilizar Bash y Curl. He utilizado este método cuando quería probar múltiples cargas de archivos.

bash_command = 'curl -v -F "file=@texas.png,texas_reversed.png"                         
http://localhost:9292/fog_upload/upload'
command_result = `#{bash_command}` # the backticks are important <br/>
puts command_result
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top