如何在没有直接链接的情况下流式传输音频文件

时间:2014-12-05 15:17:29

标签: ruby-on-rails audio nginx

我在nginx网络服务器上有一个rails web app。我的服务器上有一些音频文件,我希望人们能够听到它们,并且能够从那一点寻找音频文件的任何部分来收听。

简单吧?

我在html5音频元素的src中使用了直接链接。它运作得很好。该文件可以播放并寻求工作。

输入安全性和可审计性。

我的音频文件很敏感。我只希望某些人能够听取他们的意见。我每次听他们都需要知道。突然,公共目录无法运行。

输入rails的send_file。

Send_file最初似乎正是我所需要的。它允许rails提供我的音频文件,我可以将我的文件保存在受保护的目录中,我可以检查当前用户的权限,我可以创建适当的审计跟踪。除了...

使用send_file我无法寻找。这是一个交易破坏者。

一些stackoverflow问题解决了让send_file处理http范围/字节范围请求的问题。我评论过的是:

what is the proper way to serve mp4 files through rails...

rails media file stream accept byte range request through send file ...

经过更多的研究,我发现了以下博文: https://blog.echoplex.us/2014/08/19/so-you-want-to-stream-videoaudio-with-rails/

TL;博士 不要使用rails send_file来提供媒体服务。不要试图让它像堆栈溢出问题说的那样。相反,使用nginx和X-Accel-Redirect,最后得到一个看起来像你的请求管道 - > nginx-> rails-> nginx->你

我正在考虑采取他的方法,但不知道是否有更好的方法来做到这一点。

我有什么选择?

(另外,你可以假设我使用当前版本的rails和nginx)

1 个答案:

答案 0 :(得分:2)

请不要使用sendfile。使用X-Accel-Redirect或以下建议。

Nginx secure_link模块可帮助您直接从具有私有链接的磁盘提供文件。不需要后端。完整的示例是here