如何在Rails5上进行下载活动?

时间:2017-01-19 17:49:40

标签: ruby-on-rails ruby

我无法在Documentations和Google上找到任何关于Rails(Ruby)上的可恢复下载的内容

我在Linux上使用Ruby 2.4和Rails 5.0.1。我想让我的用户通过rails下载文件。 下载开始时我想让他们暂停恢复。并且,在每个请求的块上,我想执行某些功能(可能是事件)。

我可以在 PHP / Laravel5 上执行此操作。我可以提供可恢复的下载,我可以在每个请求的部分上运行代码。

我在Rails'上找不到任何关于此内容的内容网站或谷歌。这个庞大的框架是不是能够做到这一点?

大注:

我不是在谈论直接下载文件。我想控制每个部分。当从x字节到y字节请求时,我想在它们传递该部分之前执行一些代码。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

articleofficial documentation信息丰富。

class DownloadingController < ActionController::Base
  include ActionController::Live

  def stream
    response.headers['Content-Type'] = 'text/event-stream'
    (params[:from].to_i..params[:to].to_i).each { |i|
      response.stream.write "hello world #{i}\n"
      sleep 1
    }
  ensure
    response.stream.close
  end
end

routes.rb

get 'downloading' => 'downloading#stream'

启动:

curl -i "http://localhost:3000/downloading?from=10&to=20"

输出:

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: text/event-stream
ETag: W/"1f373c782d25c8d804203b14291b315b"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 53337282-e382-4807-bdf9-cbf689ac24b2
X-Runtime: 21.048071
Transfer-Encoding: chunked

hello world 10
hello world 11
hello world 12
hello world 13
hello world 14
hello world 15
hello world 16
hello world 17
hello world 18
hello world 19
hello world 20

恢复

如果您想恢复之前的下载,则必须检查request.headers["Range"]并设置:status => "206 Partial Content"以及response.header["Accept-Ranges"] = "bytes"

那些two answers可能对您有所帮助。