2012-03-03 34 views
9

Tôi đang cố gắng tìm hiểu làm thế nào tôi có thể xác minh những gì tôi đang ăn vào carrierwave thực sự là một hình ảnh. Nguồn tôi nhận được url hình ảnh của tôi từ không cho tôi trở lại tất cả các url trực tiếp. Một số hình ảnh không còn tồn tại nữa. Thật không may nó không thực sự trả về mã trạng thái đúng hoặc bất cứ điều gì vì tôi đã sử dụng một số mã để kiểm tra xem tập tin từ xa tồn tại và nó đã vượt qua kiểm tra đó. Vì vậy, bây giờ chỉ để được ở bên an toàn tôi muốn một cách để xác minh tôi đang nhận lại một tập tin hình ảnh hợp lệ trước khi tôi đi trước và tải về nó.Xác minh một hình ảnh từ xa thực sự là một tệp hình ảnh trong ruby?

Đây là mã kiểm tra tệp từ xa mà tôi đã sử dụng chỉ để tham khảo nhưng tôi thích thứ gì đó thực sự có thể xác định rằng tệp là hình ảnh.

require 'open-uri' 
require 'net/http' 

def remote_file_exists?(url) 
    url = URI.parse(url) 
    Net::HTTP.start(url.host, url.port) do |http| 
     return http.head(url.request_uri).code == "200" 
    end 
end 

Trả lời

8

Tôi sẽ kiểm tra xem dịch vụ có trả lại đúng loại mime trong tiêu đề HTTP loại nội dung hay không. (here's a list of mime types)

Ví dụ, Content-Type của trang chủ StackOverflow là text/html; charset=utf-8, và Content-Type của hình ảnh gravatar của bạn là image/png

Để kiểm tra header Content-Type cho image trong ruby ​​sử dụng Net: : HTTP, bạn sẽ sử dụng như sau:

def remote_file_exists?(url) 
    url = URI.parse(url) 
    Net::HTTP.start(url.host, url.port) do |http| 
     return http.head(url.request_uri)['Content-Type'].start_with? 'image' 
    end 
end 
+0

tôi đã kết thúc kiểm tra mã trạng thái đầu tiên chỉ để chắc chắn rằng nó là 200 sau đó sử dụng của bạn mã. Vì vậy, một cái gì đó như 'return (head.code ==" 200 ")? head ['Content-Type']. start_with? ('image'): false' – hadees

+0

Điều đó sẽ hiệu quả. Bạn cũng nên hỏi nhà cung cấp dịch vụ tại sao họ trả lại mã trạng thái 200 khi tài nguyên không thực sự tồn tại. –

+0

Vâng, đó là một câu hỏi hay nhưng tôi đoán chúng không đủ kỹ thuật để trả lời. Ngoài ra tôi không có quyền truy cập trực tiếp vào chúng. Hy vọng rằng điều này sẽ làm việc cho hầu hết các trường hợp. – hadees

3

Tôi đã kết thúc bằng cách sử dụng HTTParty cho việc này. Câu trả lời yêu cầu .net từ Nút Rick giữ thời gian chờ.

def remote_file_exists?(url) 
    response = HTTParty.get(url) 
    response.code == 200 && response.headers['Content-Type'].start_with? 'image' 
    end 

https://github.com/jnunemaker/httparty

6
câu trả lời

Rick Button làm việc cho tôi, nhưng tôi cần thêm hỗ trợ SSL:

def self.remote_image_exists?(url) 
    url = URI.parse(url) 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = (url.scheme == "https") 

    http.start do |http| 
    return http.head(url.request_uri)['Content-Type'].start_with? 'image' 
    end 
end 
Các vấn đề liên quan