我想只允许注册用户下载.mp3文件。
所以,我决定隐藏.mp3文件的实际位置,并允许使用http://example.com/donwload.php?mp3_name=1下载
文件donwload.php检查用户登录的天气,然后使用readfile()读取未显示给用户的文件夹中的文件位置。
这里的问题是,访问http://example.com/donwload.php?mp3_name=1获取500kb的.mp3文件需要3秒才能加载(显示保存对话框)
还有其他方法可以在PHP中快速读取文件吗?
由于 阿卡什
答案 0 :(得分:1)
答案很简短,因为我已经不多了。 (稍后会提供更多信息)。这个答案也采用了一种替代方法来解决你想要做的事情。
如果可能,您应该使用具有专用ACL的系统,该系统支持存储在其上的所有文件。 例如,如果您使用Amazon S3,那么您可以为存储在存储桶中的每个对象提供自己的ACL,并且您还可以动态生成有效且仅签名为X分钟的链接。
根据您的情况,您可以做的是将您拥有的每个MP3文件存储在像Amazon S3这样的东西上(还有其他人在那里,所以不觉得你必须使用S3),然后当用户制作一个购买和交易确认后,您可以使用S3 API为图像生成链接。
这将是:
get_object_url( 'my-mp3s.com', 'albums/Foo/bar.mpg')
然后,您将获得一个可以提供给客户的URL。 或者,您可以要求Amazon生成在15分钟内过期的URL。
答案 1 :(得分:0)
您可以使用file_get_contents而不是readfile()http://php.net/manual/en/function.file-get-contents.php
或X-Sendfile apache模块。
答案 2 :(得分:0)
如果你的mp3在不同的服务器上,你可以用modsecdownload安装lighttpd,或者如果你只有一台机器的话,在另一个端口上运行lighttpd
http://redmine.lighttpd.net/wiki/1/Docs:ModSecDownload
因此,您只能为登录用户生成下载链接,该链接有效时间为几分钟,并且可以下载。我认为这样会更好,因为如果你有很多流量,它会比读取文件并将其发送给用户使用更少的内存。
希望这有帮助!