【问题标题】:Sinatra: How to respond with an image with headers "content-type" => "image/jpeg"Sinatra:如何响应带有标题“content-type”=>“image/jpeg”的图像
【发布时间】:2013-12-15 01:33:17
【问题描述】:

示例:

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 上)。它适用于生成标识的站点。

结帐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

然后它可以工作,但是,我觉得这可能会慢很多,因为我的服务器首先必须下载图像并打开它,然后用户必须从我的服务器下载图像。

【问题讨论】:

    标签: image sinatra content-type


    【解决方案1】:

    是的,如果您想从您的服务器发送,您需要在发送之前将其安装在您的服务器上。所以大多数时候你需要使用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
    

    【讨论】:

    • 您好伊万,感谢您的回复。但是,javascript 不起作用,因为我希望客户端能够在其 html 中使用它,例如“”。请查看我更新的问题
    • 好的,我明白了,这里还有更多选项。当您使用 S3 时,您可以查看 stackoverflow.com/questions/1322030/… 这个答案。它将为您提供一些如何从 s3 提供文件的想法。更重要的是,您可以在生成文件时发送文件,然后在其他线程中将其发送到 S3。
    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多