我无法在Documentations和Google上找到任何关于Rails(Ruby)上的可恢复下载的内容
我在Linux上使用Ruby 2.4和Rails 5.0.1。我想让我的用户通过rails下载文件。 下载开始时我想让他们暂停并恢复。并且,在每个请求的块上,我想执行某些功能(可能是事件)。
我可以在 PHP / Laravel5 上执行此操作。我可以提供可恢复的下载,我可以在每个请求的部分上运行代码。
我在Rails'上找不到任何关于此内容的内容网站或谷歌。这个庞大的框架是不是能够做到这一点?
我不是在谈论直接下载文件。我想控制每个部分。当从x字节到y字节请求时,我想在它们传递该部分之前执行一些代码。
有什么想法吗?
答案 0 :(得分:2)
此article和official 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"
。