我有一个 Rails Web 应用程序位于 nginx Web 服务器上。我的服务器上有一些音频文件,我希望人们能够收听它们,并且能够寻找音频文件的任何部分从该点开始收听。
简单吧?
我在 html5 音频元素的 src 中使用直接链接。效果很好。文件可以播放并且搜索成功。
输入安全性和可审核性。
我的音频文件很敏感。我只希望某些人能够倾听他们的声音。我还需要知道他们每次听他们说话的时间。突然间公共(public)目录无法工作。
输入rails的send_file。
Send_file 最初似乎正是我所需要的。它允许 Rails 为我的音频文件提供服务,我可以将我的文件保存在 protected 目录中,我可以检查当前用户的权限,并且我可以创建适当的审核跟踪。除了...
使用 send_file 我无法查找。这是一个大问题。
一些 stackoverflow 问题涉及如何让 send_file 处理 http-range/byte-range 请求。我评论过的有:
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 来提供媒体服务。不要试图像 stackoverflow 问题所说的那样做到这一点。相反,使用 nginx 和 X-Accel-Redirect,最终得到一个类似于 you->nginx->rails->nginx->you
的请求管道我正在考虑采用他的方法,但不知道是否有更好的方法。
我有什么选择?
(另外,您可以假设我正在使用当前版本的 Rails 和 nginx)
最佳答案
请不要使用 sendfile。使用 X-Accel-Redirect 或以下建议。
Nginx secure_link 模块可帮助您通过私有(private)链接直接从磁盘提供文件。无需后端。完整的示例是 here .
关于ruby-on-rails - 如何在没有直接链接的情况下流式传输音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27319054/