2010-03-25 8 views

risposta

258

Prova questa:

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

Questo funziona. Grazie. Ho provato questo su un'immagine. L'immagine non è stata scritta correttamente nel file. Come se fosse stato corrotto o qualcosa del genere. Potresti anche guidarmi a fare lo stesso in un'applicazione Rails. Posso usare questo in un'applicazione Rails? –

+0

Sì, è possibile utilizzarlo in un'applicazione rotaia. Il file non viene scritto correttamente è probabilmente perché ho dimenticato di aprire la destinazione in modalità write-binary. Lo modificherò ora. – Levi

+3

dovrebbe anche essere 'file << open ('http://example.com/image.png') .read' – mraaroncruz

4

Verificare Net::HTTP nella libreria standard. La documentazione fornisce diversi esempi su come scaricare documenti usando HTTP.

29

Se stai usando graffetta, scaricando da un URL viene ora gestita automaticamente.

Supponendo che hai qualcosa di simile:

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

del modello, basta specificare l'immagine come un URL, qualcosa di simile (scritto in longhand deliberata):

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

You' Probabilmente vorrà metterlo in un metodo nel tuo modello. Funzionerà anche bene sul filesystem temporaneo di Heroku.

Paperclip lo prenderà da lì.

fonte: paperclip documentation

+0

Per i futuri utenti, Paperclip non lo consente più per impostazione predefinita: https://medium.com/in-the-weeds/all-about-paperclips -cve-2017-0889-server-side-request-forgery-ssrf-vulnerability-8cb2b1c96fe8 –

83

Una versione ancora più breve:

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

Per mantenere lo stesso nome:

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

E più efficiente in quanto l'output non è memorizzato come una stringa in memoria. +1 –

+0

Anche se è utile avere entrambe le risposte visualizzate, così le persone come me possono vederle entrambe, pensare alle differenze e quindi scegliere consapevolmente questa risposta per le giuste ragioni :) –

5

Credo che questo sia il modo più chiaro:

require 'open-uri' 

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