2012-06-13 8 views
12

Estoy usando ruby ​​1.9.2 junto con Rails 3.1.4 y Paperclip 2.4.5.Ruby open-uri método abierto pierde la extensión de archivo al abrir imágenes

Mi problema es tratar de guardar un archivo adjunto de clip de un URI, pierde la extensión del archivo y guarda el archivo sin que se produzcan problemas con elementos como fancybox que requieren una extensión.

un código de ejemplo:

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png" 
open(uri) 
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv> 

Debido a que no hay ninguna extensión en el clip archivo temporal se guarda el archivo sin uno que resulta en problemas.

¿Alguien se ha encontrado con este problema? He visto múltiples respuestas acerca del uso de clip para almacenar imágenes de una URI, pero ninguno parece abordar el mismo problema que nos estamos quedando

+1

estoy frente a este problema también. – jfedick

Respuesta

0

No estoy seguro si esto le ayudará en su caso, pero notaba cuestiones similares en mi proyecto.

El problema no fue causado por Paperclip ni open-uri, sino por el receptor del archivo de clip (en mi caso Spree Commerce). Compruebe que está asignando el objeto clip al objeto correcto, y que está siendo interpretado correctamente.

La solución que trabajó para mí era cambiar:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

a

@product.master.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

Buena suerte con su tema

-1

Sí, es un problema, pero podemos evitar esto con fancybox.

En la etiqueta de enlace (para imágenes) añadir :type => 'image'

- @images.each do |image| 
= link_to image_tag(image.attachment.url), image.attachment.url, class: "fancybox", type: 'image' 

Al especificar 'tipo', FancyBox anula el tipo de imagen

https://groups.google.com/forum/?fromgroups=#!topic/fancybox/QgjquBCLynU

+1

Esto realmente no se mueve mucho y agrega un requisito para que Fancybox muestre imágenes – Jimmy

0

¿Ha inclued el: extensión de su ruta/url opción?

Por ejemplo:

has_attached_file :image, 
    ... 
    :url => '/images/highlights/:id_partition/:style_:id.:extension', 
    :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension' 

Esto probablemente resolver su problema. Puede forzar una extensión allí, pero no creo que sea recomendable.

3

¡No utilice el archivo temporal! Está allí como un marcador de posición, ya que el archivo se lee desde el puerto y se debe considerar como un recurso privado para OpenURI. En su lugar, use open(url).read y trabaje con el contenido resultante guardándolo.

hacer algo como:

require 'uri' 
require 'open-uri' 

url = 'http://www.iana.org/domains/example/index.html' 
filename = File.basename(URI.parse(url).path) 
File.open(filename, 'wb') do |fo| 
    fo.write(open(url).read) 
end 

Temporalmente se está almacenando en el disco durante una operación, especialmente una operación de red, es común. Una vez que el contenido del archivo se ha acumulado, está disponible para pasarlo a la aplicación.read está bloqueando, por lo que su código se detendrá hasta que se le devuelva el archivo. Entonces puedes jugar con eso.

2

La extensión no es importante para el archivo temporal, pero si desea utilizar este archivo en el código o guardar en otro lugar. Puede hacerlo:

temp_file = open(params[:url]) 
def temp_file.original_filename; File.basename(base_uri.path); end 

Ahora, puede guardar este archivo temporal al espacio permanente o usarlo en el código; El nombre de archivo original se usará automáticamente.

+0

No funciona. Parte de la magia adicional parece ser necesaria para hacer que 'base_uri' sea accesible para el método definido original_filename aquí, fyi. – ericpeters0n

Cuestiones relacionadas