2010-03-25 30 views

Trả lời

258

Hãy thử điều này:

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

Những công việc này. Cảm ơn. Tôi đã thử nó trên một hình ảnh. Hình ảnh không được ghi chính xác vào tệp. Như thể nó đã bị hỏng hay gì đó. Ngoài ra bạn có thể hướng dẫn tôi làm điều tương tự trong ứng dụng Rails. Tôi có thể sử dụng nó trong ứng dụng Rails không? –

+0

Có, bạn có thể sử dụng nó trong ứng dụng đường ray. Các tập tin không được viết đúng cách có lẽ là vì tôi quên mở đích trong chế độ ghi nhị phân. Tôi sẽ chỉnh sửa ngay bây giờ. – Levi

+3

cũng phải là 'tệp << mở (' http://example.com/image.png ') .read' – mraaroncruz

4

Kiểm tra Net::HTTP trong thư viện chuẩn. Tài liệu cung cấp một số ví dụ về cách tải xuống tài liệu bằng cách sử dụng HTTP.

29

Nếu bạn đang sử dụng kẹp giấy, tải từ một URL bây giờ được xử lý tự động.

Giả sử bạn đã có một cái gì đó như:

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

Mở mô hình của bạn, chỉ cần chỉ định hình ảnh dưới dạng URL, một cái gì đó như thế này (viết bằng ý longhand):

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

Bạn' có lẽ sẽ muốn đặt điều này trong một phương thức trong mô hình của bạn. Điều này cũng sẽ làm việc tốt trên hệ thống tập tin tạm thời của Heroku.

Kẹp giấy sẽ lấy từ đó.

nguồn: paperclip documentation

+0

Đối với những người tìm kiếm trong tương lai, Paperclip không còn cho phép điều này theo mặc định: https://medium.com/in-the-weeds/all-about-paperclips -cve-2017-0889-server-side-request-forgery-ssrf-vulnerability-8cb2b1c96fe8 –

83

Một phiên bản thậm chí ngắn hơn:

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

Để giữ cho tên tập tin giống nhau:

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

Và hiệu quả hơn vì đầu ra không được lưu dưới dạng chuỗi trong bộ nhớ. +1 –

+0

Mặc dù nó thực sự hữu ích khi cả hai câu trả lời được hiển thị, vì vậy những người như tôi có thể thấy cả hai, hãy nghĩ về sự khác biệt và sau đó chọn câu trả lời này một cách có ý thức vì những lý do đúng :) –

5

Tôi nghĩ rằng đây là cách rõ ràng nhất:

require 'open-uri' 

File.write 'image.png', open('http://example.com/image.png').read 
Các vấn đề liên quan