django实现文件上传和下载,怎么将django项目上传到服务器
在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用网服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍框架中的文件下载。
这里我们将下载的文件存放在项目媒体目录下,当然在实际中并不会这样做。
方式一:使用HttpResponse
进口货
来自姜戈。httpimporthttpresponse,Http404
定义媒体_文件_下载(请求,文件路径):
withopen(file_path, rb)asf:
尝试:
response=HttpResponse(f)
响应[内容类型]=应用程序/八位字节流
响应[内容处置]=附件;filename= OS。路径。基本名称(文件路径)
返回响应
例外例外:
raiseHttp404HttpResponse有个很大的弊端,其工作原理是先读取文件,载入内存,然后再输出。如果下载文件很大,该方法会占用很多内存。对于下载大文件姜戈更推荐StreamingHttpResponse和文件响应方法,这两个方法将下载文件分批(组块)写入用户本地磁盘,先不将它们载入服务器内存。
方式二:使用StreamingHttpResponse
进口货
来自姜戈。httpimporthttpresponse,Http404,StreamingHttpResponse
defstream _ http _下载(请求,文件路径):
尝试:
response=StreamingHttpResponse(open(file _ path, rb ))
响应[内容类型]=应用程序/八位字节流
响应[内容处置]=附件;filename= OS。路径。基本名称(文件路径)
返回响应
例外例外:
太阳神
iseHttp404方式三:使用FileResponse
importos
文件名中文乱码问题
其中用英文的文件名,浏览器显示正常,但是用了中文后,就是默认的文件名,如下载.xls,或者如果我用了utf-8编码,是乱码。解决方法如下:
response['Content-Disposition']="attachment;filename*=utf-8''{}".format(escape_uri_path(name))
文件私有化的两种方法
如果你想实现只有登录过的用户才能查看和下载某些文件,大概有两种方法,这里仅提供思路。
上传文件放在media文件夹,文件名使用很长的随机字符串命名(uuid), 让用户无法根据文件名猜出这是什么文件。视图和模板里验证用户是否已登录,登录或通过权限验证后才显示具体的url。- 简单易实现,安全性不高,但对于一般项目已足够。
上传文件放在非media文件夹,用户即使知道了具体文件地址也无法访问,因为Django只会给media文件夹里每个文件创建独立url资源。视图和模板里验证用户是否已登录,登录或通过权限验证后通过自己编写的下载方法下载文件。- 安全性高,但实现相对复杂。
个人下载文档view视图代码
fromdjango.viewsimportView
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。