我正在编写一个Django应用程序,让你在满足一些要求后下载文件(例如,你必须登录)。否则该文件需要无法访问。
通过Apache提供文件将无法正常工作:我必须在数据库中检查用户的权限。此外,无权更改我的Apache配置。
所以我想在Django中读取文件,然后设置适当的标题并将其发送到客户端。
我使用了Django手册中this页面上的信息来获取标题。
我有以下代码:
#<- check persmissons here, continue if allowed ->
#read the pdf file
location = 'file.pdf'
file = open(location, 'r')
content = file.read()
file.close
#serve the file
response = HttpResponse(content, mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=filename.pdf'
return response
但是,下载的文件似乎已损坏:无法在Adobe Reader中打开。 我想也许这可能是一些编码问题,但我无法弄明白。
感谢任何帮助:)
答案 0 :(得分:4)
您必须以二进制模式open()
文件(考虑docs)。
就像这样:
file = open(location, 'rb')
我不知道它是否适用于您(因为您不允许更改Apache的设置),但出于性能原因,我建议使用Lighttpd + mod_secdownload。这个优雅的解决方案利用Lighttpd优化服务静态内容,同时将授权决策委托给第三方(在您的情况下为Django)。