Veamos, a mi esto me supuso una pequeña odisea, así que os escribo este post y así vais prevenidos para el día que os haga falta.

Estoy realizando un proyecto en rails + flash, y la subida de imágenes desde flash8 era un requerimiento, aunque una pequeña parte del proyecto.

El caso es que yo para empezar a familiarizarme con Filereference me leí este fantástico tutorial de Cristalab, donde se hace upload pero utilizando php por detrás. Yo estaba usando rails, entonces me iba a hacer falta adaptarlo.

Peeeeeero cada vez que trataba de subir una imagen me daba errores el cgi. Resulta que flash8, al hacer un upload envía cabeceras vacías o incorrectas, y podemos ver mensajitos en el log como

o bien

Dispatcher failed to catch: bad content body 
 Dispatcher failed to catch: no content body 

Finalmente dando un googleo me he encontrado este post en bubbleshare con el apropiado título de Dolores de cabeza del flash8 upload donde encontramos la solución al envío de cabeceras vacias o incorrectas de flash8 frente a rails. También lo he encontrado reflejado aquí.

Cuando ya estás haciendo toooodo esto te entra la cagalera cuando ves el "__corrupt_multipart_data"=>"true", algo así:

Processing HomeController#upload (for x.x.x.xat 2006-08-29 15:43:17) [POST]
   Session ID: 571a450fd1341dec9e6516015490ebe9
   Parameters: {"Filename"=>"imagen.png", "__corrupt_multipart_data"=>"true", "action"=>"upload", "controller"=>"home", "Filedata"=>#}

Pero nuestros problemas ya han pasado a la historia con el parchecito que hemos puesto. En este post de collcoll nos dejan el código que tienen para manejar el archivo una vez ha llegado, y funciona perfectamente. Os lo pongo aquí también. Este por ejemplo nos dejaría copiada la imagen con el mismo nombre dentro de la carpeta images/upload.

def upload
 
 	@content_name = @params['Filedata'].original_filename.gsub(/[^a-zA-Z0-9.]/, '_')
 		File.open("#{RAILS_ROOT}/public/images/upload/"+@content_name, "wb") do |f|
 			f.write(@params['Filedata'].read)
 		end
 	render(:nothing=>true)
 
 end

A partir de aquí cada uno que complique su código todo lo que le haga falta. Por ejemplo, yo una vez guardo los originales se los paso a RMagick para retocar, cortar, pegar, montar y muchos más ar.

No se si vale de mucho, pero he hecho un paquetito con el .fla que he usado para el test, parte del código del controlador, el flash fix. Aquí teneis.

Salud!