2010-03-25 26 views

Respuesta

258

Prueba esto:

require 'open-uri' 
open('image.png', 'wb') do |file| 
    file << open('http://example.com/image.png').read 
end 
+0

Esto funciona. Gracias. Intenté esto en una imagen. La imagen no se escribió correctamente en el archivo. Como si hubiera sido dañado o algo así. También podrías guiarme para hacer esto en una aplicación de Rails. ¿Puedo usar esto en una aplicación de Rails? –

+0

Sí, puede usarlo en una aplicación de rieles. Es probable que el archivo no se haya escrito correctamente porque olvidé abrir el destino en el modo de escritura binaria. Voy a editar eso ahora. – Levi

+3

también debería ser 'file << open ('http://example.com/image.png') .read' – mraaroncruz

4

Consulte Net::HTTP en la biblioteca estándar. La documentación proporciona varios ejemplos sobre cómo descargar documentos utilizando HTTP.

29

Si está utilizando PaperClip, la descarga de una dirección URL que ahora se realiza de forma automática.

Asumiendo que tienes algo como:

class MyModel < ActiveRecord::Base 
    has_attached_file :image, ... 
end 

En su modelo, basta con especificar la imagen como una dirección URL, algo como esto (escrito en escritura a mano deliberada):

@my_model = MyModel.new 
image_url = params[:image_url] 
@my_model.image = URI.parse(image_url) 

Usted' Probablemente quiera poner esto en un método en su modelo. Esto también funcionará bien en el sistema de archivos temporal de Heroku.

Paperclip lo llevará desde allí.

fuente: paperclip documentation

+0

Para futuros buscadores, Paperclip ya no lo permite de manera predeterminada: https://medium.com/in-the-weeds/all-about-paperclips -cve-2017-0889-server-side-request-forgery-ssrf-vulnerabilidad-8cb2b1c96fe8 –

83

Una versión aún más corta:

require 'open-uri' 
download = open('http://example.com/image.png') 
IO.copy_stream(download, '~/image.png') 

Para mantener el mismo nombre de archivo:

IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}") 
+1

Y más eficiente ya que la salida no se almacena como una cadena en la memoria. +1 –

+0

Aunque en realidad es útil que se muestren ambas respuestas, para que la gente como yo pueda ver las dos, pensar en las diferencias y luego elegir conscientemente esta respuesta por las razones correctas :) –

5

Creo que esta es la manera más clara:

require 'open-uri' 

File.write 'image.png', open('http://example.com/image.png').read 
Cuestiones relacionadas