Rails 5 - 以较小的块流文件?

时间:2017-10-08 19:23:45

标签: ruby-on-rails

我正在从rails服务器向微控制器发送文件。微控制器内存不足,因为(我们相信)文件是以太大的块发送的 - 一次最多16 kb。

如何从S3获取StringIO对象并以4kb块的形式将其发送给请求者?

我目前的实施:

file_name = "#{version}.zip"
firmware_file = s3(file_name).get()
response.headers['Content-Length'] = firmware_file.body.size.to_s
send_data firmware_file.body.read, filename: file_name

2 个答案:

答案 0 :(得分:2)

Rails有ActionController::Live模块,可以帮助您实时传输响应。在您的情况下,由于您希望创建较小的块并将其发送到客户端(微控制器),因此该功能可能很有用。

aaron patterson撰写的文章Is It Live?中的“文件系统监控”部分解释了如何使用ActionController::Live实时将文件系统中的更改推送到客户端。

希望这有帮助!

答案 1 :(得分:0)

简而言之,您需要利用ActionController::Live才能将响应数据流式传输到您的客户端。

由于您正在传输zip文件,因此可以使用优雅的zipline gem。我特别喜欢这个gem的地方是它支持a large number of streamable object types-因此,您可以想到的任何东西都可以使用它,它将找出如何在无需您花费太多精力的情况下进行流式处理。