2010-03-25 10 views

Antwort

258

Versuchen Sie folgendes:

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

Das funktioniert. Vielen Dank. Ich habe das auf einem Bild versucht. Das Bild wurde nicht ordnungsgemäß in die Datei geschrieben. Als wäre es beschädigt oder so. Sie könnten mir auch helfen, dies in einer Rails-Anwendung zu tun. Kann ich das in einer Rails-Anwendung verwenden? –

+0

Ja, Sie können es in einer Schienenanwendung verwenden. Die Datei wird nicht richtig geschrieben, weil ich vergessen habe, das Ziel im Write-Binary-Modus zu öffnen. Ich werde das jetzt bearbeiten. – Levi

+3

sollte auch 'Datei << öffnen ('http://example.com/image.png') .read' – mraaroncruz

4

Auschecken Net::HTTP in der Standardbibliothek. Die Dokumentation enthält mehrere Beispiele zum Herunterladen von Dokumenten über HTTP.

29

Wenn Sie Paperclip verwenden, von einer URL nun heruntergeladen automatisch gehandhabt wird.

Angenommen, Sie haben so etwas wie bekommen:

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

Auf Ihrem Modell, geben Sie einfach das Bild als eine URL, so etwas wie diese (geschrieben in vorsätzlicher Langschrift):

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

Sie‘ Ich möchte das wahrscheinlich in eine Methode in Ihrem Modell einfügen. Dies funktioniert auch gut auf Herokus temporärem Dateisystem.

Büroklammer wird es von dort nehmen.

Quelle: paperclip documentation

+0

Für zukünftige Sucher, Paperclip nicht mehr erlaubt dies standardmäßig: https://medium.com/in-the-weeds/all-about-paperclips -cve-2017-0889-server-side-request-forgery-ssrf-vulnerability-8cb2b1c96fe8 –

83

Eine noch kürzere Version:

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

die gleichen Dateinamen zu bleiben:

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

Und effizienter, da die Ausgabe nicht als Zeichenfolge im Speicher gespeichert wird. +1 –

+0

Obwohl es wirklich nützlich ist, beide Antworten angezeigt zu bekommen, so können Leute wie ich beide sehen, über die Unterschiede nachdenken und dann diese Antwort aus den richtigen Gründen bewusst wählen :) –

5

Ich denke, dies der klarste Weg ist:

require 'open-uri' 

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