在一个机架应用中投放存储在S3上的HTML文件(Serve HTML files stored on

2019-10-17 14:06发布

说我有存储在S3一些HTML文档喜欢这样的:

  • http://alan.aws-s3-bla-bla.com/posts/1.html
  • http://alan.aws-s3-bla-bla.com/posts/2.html
  • http://alan.aws-s3-bla-bla.com/posts/3.html
  • http://alan.aws-s3-bla-bla.com/posts/1/comments/1.html
  • http://alan.aws-s3-bla-bla.com/posts/1/comments/2.html
  • http://alan.aws-s3-bla-bla.com/posts/1/comments/3.html
  • 等等,等等。

我想与齿条(优选西纳特拉)应用程序为这些,映射以下路线:

get "/posts/:id" do
 render "http://alan.aws-s3-bla-bla.com/posts/#{params[:id]}.html"
end

get "/posts/:posts_id/comments/:comments_id" do
 render "http://alan.aws-s3-bla-bla.com/posts/#{params[:posts_id]}/comments/#{params[:comments_id}.html"
end

这是一个好主意吗? 我会怎么做呢?

Answer 1:

有显然是等待,而你抓住的文件,所以你可以缓存,或设置的ETag等,以帮助这一点。 我想这取决于你要等待多久,以及它被访问,它的大小等它是否值得保存在本地或远程的HTML。 只有你可以的工作,有点出入。

如果该块中的最后一个表达式是,它会自动呈现一个字符串,所以没有必要调用render只要你打开该文件作为一个字符串。

以下是如何抓住一个外部文件,并把它变成一个临时文件:

require 'faraday'
require 'faraday_middleware'
#require 'faraday/adapter/typhoeus' # see https://github.com/typhoeus/typhoeus/issues/226#issuecomment-9919517 if you get a problem with the requiring
require 'typhoeus/adapters/faraday'

configure do
  Faraday.default_connection = Faraday::Connection.new( 
    :headers => { :accept =>  'text/plain', # maybe this is wrong
    :user_agent => "Sinatra via Faraday"}
  ) do |conn|
    conn.use Faraday::Adapter::Typhoeus
  end
end

helpers do
  def grab_external_html( url )
    response = Faraday.get url # you'll need to supply this variable somehow, your choice
    filename = url # perhaps change this a bit
    tempfile = Tempfile.open(filename, 'wb') { |fp| fp.write(response.body) }
  end
end

get "/posts/:whatever/" do
  tempfile = grab_external_html whatever # surely you'd do a bit more here…
  tempfile.read
end

这可能会实现。 您可能还需要考虑关闭该临时文件,但是垃圾收集器和OS 应该照顾它。



文章来源: Serve HTML files stored on S3 on a Rack app