2013-11-28 25 views
4

例子:西納特拉:如何與頭的圖像「內容類型」 =>「圖像/ JPEG」迴應

require 'sinatra' 

get '/somekey' do 
    headers('Content-Type' => "image/jpeg") 
    ["http://upload.wikimedia.org/wikipedia/commons/2/23/Lake_mapourika_NZ.jpeg", "http://img.brothersoft.com/screenshots/softimage/j/jpeg_converter-4567-1.jpeg"].sample 
end 

我想與那不是我的服務器上託管的圖像響應。

我該如何解決這個問題?

注意: 圖像的鏈接不是祕密(因爲它在S3上託管)。這是一個生成identicons的網站。

結帳http://identico.in/[insert_any_key_here]。原因是我希望服務器進行查找,如果圖像已經存在於S3上,則使用該圖像,如果沒有,則生成一個,然後將其上傳到s3。

注: 如果我:

require "open-uri" 
open ["http://upload.wikimedia.org/wikipedia/commons/2/23/Lake_mapourika_NZ.jpeg", "http://img.brothersoft.com/screenshots/softimage/j/jpeg_converter-4567-1.jpeg"].sample 

然後它工作,但是,我覺得這可能是慢了很多,因爲我的服務器首先要下載的圖片,打開它,然後用戶有從我的服務器下載圖像。

回答

6

是的,如果你想從你的服務器發送,你需要在你的服務器上發送它之前。因此,大多數時候您需要使用send_file open('link')並且是存儲服務器和客戶端的代理。

require 'sinatra' 
require 'open-uri' 

get '/' do 
    send_file open('http://upload.wikimedia.org/wikipedia/commons/2/23/Lake_mapourika_NZ.jpeg'), 
     type: 'image/jpeg', 
     disposition: 'inline' 
end 

但是,如果一個鏈接不是祕密,你可以渲染一些JavaScript,它會在瀏覽器中打開圖像。

require 'sinatra' 
get '/' do 
    "<script>document.location = 'http://upload.wikimedia.org/wikipedia/commons/2/23/Lake_mapourika_NZ.jpeg'</script> 
end 
+0

嗨伊萬,謝謝你的迴應。然而,JavaScript不會工作,因爲我希望客戶能夠在他們的HTML內使用它,例如「」。請參閱我的更新問題 – samol

+0

好吧,我明白了,這裏有更多選項。當你使用S3時,你可以看看http://stackoverflow.com/questions/1322030/using-send-file-to-a-remote-source-ruby-on-rails這個答案。它會給你一些想法如何從s3提供文件。 更重要的是,您可以在生成文件時發送文件,然後將文件發送到其他線程中的S3。 –