为了账号安全,请及时绑定邮箱和手机立即绑定

让Django提供可下载的文件

让Django提供可下载的文件

LEATH 2019-06-25 16:22:45
让Django提供可下载的文件我希望网站上的用户能够下载路径模糊的文件,这样他们就不能直接下载。例如,我希望URL是这样的,“http://example.com/download/?f=somefile.txt在服务器上,我知道所有可下载的文件都位于一个文件夹“/home/user/files/”中。有什么方法可以让Django为下载文件提供服务,而不是试图找到一个URL和View来显示它呢?
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

对于“两个世界中最好的”,您可以将S.Lott的解决方案与xsendfile模块:Django生成文件(或文件本身)的路径,但实际文件由Apache/Lightttpd处理。一旦设置了mod_xsendfile,与视图的集成需要几行代码:

from django.utils.encoding import smart_str

response = HttpResponse(mimetype='application/force-download') # mimetype is replaced by content_type for django 1.7response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)response['X-Sendfile'] = smart_str(path_to_file)# It's usually a good idea to set the 'Content-Length' header too.# You can also set any other required headers: Cache-Control, etc.return response

当然,只有当您控制您的服务器,或者您的托管公司已经设置mod_xsendfile时,这才能工作。

编辑:

mimetype被Django 1.7的content_type替换

response = HttpResponse(content_type='application/force-download'


查看完整回答
反对 回复 2019-06-25
?
烙印99

TA贡献1829条经验 获得超13个赞

对于一个非常简单的但没有效率或可伸缩性解决方案,您可以只使用Django中构建的serve视野。对于快速原型或一次性工作来说,这是很好的,但是正如在整个问题中所提到的,您应该在生产中使用类似Apache或nginx之类的东西。

from django.views.static import serve
filepath = '/some/path/to/local/file.txt'return serve(request, os.path.basename(filepath), os.path.dirname(filepath))


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 1152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信