全教育培训行业第三方平台平台就业机构
扫码试听
扫码试听
Q:2638333071
首页 > 行业动态 > > Django怎么实现文件下载功能(django实现文件上传和下载)
行业动态 行业问答 课程问答 零基础学习 就业前景 技术干货

Django怎么实现文件下载功能(django实现文件上传和下载)

发布时间:3 个 月 前 栏目:行业动态 浏览:

1、Django怎么实现文件下载功能


这次给大家带来Django怎么实现文件下载功能,Django实现文件下载功能的注意事项有哪些,下面就是实战案例,一起来看一下。

基于Django建立的网站,如果提供文件下载功能,最简单的方式莫过于将静态文件交给Nginx等处理,但有些时候,由于网站本身逻辑,需要通过Django提供下载功能,如页面数据导出功能(下载动态生成的文件)、先检查用户权限再下载文件等。因此,有必要研究一下文件下载功能在Django中的实现。


最简单的文件下载功能的实现


将文件流放入HttpResponse对象即可,如:

def file_download(request):
# do something...
with open(\'file_name.txt\') as f:
c = f.read()
return HttpResponse(c)

这种方式简单粗暴,适合小文件的下载,但如果这个文件非常大,这种方式会占用大量的内存,甚至导致服务器崩溃


更合理的文件下载功能


Django的HttpResponse对象允许将迭代器作为传入参数,将上面代码中的传入参数c换成一个迭代器,便可以将上述下载功能优化为对大小文件均适合;而Django更进一步,推荐使用 StreamingHttpResponse对象取代HttpResponse对象,StreamingHttpResponse对象用于将文件流发送给浏览器,与HttpResponse对象非常相似,对于文件下载功能,使用StreamingHttpResponse对象更合理。


因此,更加合理的文件下载功能,应该先写一个迭代器,用于处理文件,然后将这个迭代器作为参数传递给StreaminghttpResponse对象,如:

from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...

def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break

the_file_name = "file_name.txt"
response = StreamingHttpResponse(file_iterator(the_file_name))

return response

文件下载功能再次优化


上述的代码,已经完成了将服务器上的文件,通过文件流传输到浏览器,但文件流通常会以乱码形式显示到浏览器中,而非下载到硬盘上,因此,还要在做点优化,让文件流写入硬盘。优化很简单,给StreamingHttpResponse对象的Content-Type和Content-Disposition字段赋下面的值即可,如:

response[\'Content-Type\'] = \'application/octet-stream\'
response[\'Content-Disposition\'] = \'attachment;filename="test.pdf"\'

完整代码如下:

from django.http import StreamingHttpResponse
def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break

the_file_name = "big_file.pdf"
response = StreamingHttpResponse(file_iterator(the_file_name))
response[\'Content-Type\'] = \'application/octet-stream\'
response[\'Content-Disposition\'] = \'attachment;filename="{0}"\'.format(the_file_name)
return response

具体导出文件格式


导出Excel表格


1. 首先是直接导出Excel表格


首先获取要导出的数据、以列表方式保存。


然后将数据写入到Excel,以流的方式返回到页面下载。

import xlwt
import io
import json
from django.http import HttpResponse
def set_style(name, height, bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = name # \'Times New Roman\'
font.bold = bold
font.color_index = 000
font.height = height
style.font = font
# 设置单元格边框
# borders= xlwt.Borders()
# borders.left= 6
# borders.right= 6
# borders.top= 6
# borders.bottom= 6
# style.borders = borders
# 设置单元格背景颜色
# pattern = xlwt.Pattern()
# 设置其模式为实型
# pattern.pattern = pattern.SOLID_PATTERN
# 设置单元格背景颜色
# pattern.pattern_fore_colour = 0x00
# style.pattern = pattern
return style
def write_excel(data, name, header):
# 打开一个Excel工作簿
file = xlwt.Workbook()
# 新建一个sheet,如果对一个单元格重复操作,会引发异常,所以加上参数cell_overwrite_ok=True
table = file.add_sheet(name, cell_overwrite_ok=True)
if data is None:
return file
# 写标题栏
row0 = [u\'业务\

Django怎么实现文件下载功能

2、为什么django 文件传到前端无法下载?

在Django中,文件无法下载的问题可能有多种原因,以下是一些可能的情况:


1.**文件路径错误**:在Django中提供给前端下载的文件路径可能存在问题。你需要确保服务器上的文件路径正确,并且Django有足够的权限来访问这个文件。


2.**设置问题**:你可能没有在Django的settings.py中适当地配置MEDIA_URL和MEDIA_ROOT。


3.**视图函数问题**:在你的视图函数中,你可能没有正确地处理文件下载。例如,你需要使用FileResponse或StreamingHttpResponse来为用户提供文件。


4.**URL配置问题**:你可能没有在urls.py中正确地配置你的URL来指向正确的视图函数。


5.**浏览器或网络问题**:有时,尽管你的代码没有问题,但由于浏览器或网络设置问题,文件无法被下载。


如果你可以提供更详细的信息,比如你的代码片段、错误提示等,我可以为你提供更具体的帮助。

Django怎么实现文件下载功能

3、Django上传原理求解

随着网站运作,难免有些时候需要上传文件。上传文件自然是上传到网站所在的服务器,日积月累,慢慢地网站存储空间越来越少。而且网站迁移和备份都不方便,使用这些资源时也占用大量服务器流量。

较好的解决方案是使用第三方存储服务器,例如七牛、阿里云OSS、亚马逊S3等。将文件都放到这些存储服务器,可以减少服务器负担。服务器只剩下必要的静态文件和代码。

以阿里云OSS为例,讲解如何使用第三方存储服务器。(刚好最近用到这个,而且Django有其他人写好的第三方库)

首先,需要拥有OSS。这个去阿里云购买即可。购买之后可得到密钥等一系列信息。

接着,安装oss2库,该库是Python对应oss的操作库。

再安装或下载Django OSS的Storage库。这些库是继承Django的Storage类,并重写相关方法。Django的Stroage是管理上传文件的存储。如何自定义Storage可参考Django官方文档。

执行如下命令,安装Django-Aliyun-OSS2-Storage:

也可以不用pip安装,打开该第三方库的Github,下载源码到本地。这里我需要修改部分代码,所以直接下载把整个包放到Django项目的根目录(也可其他位置)。

安装下载完成之后,配置Django的Settings,添加如下设置:

另外,还有两个对应参数需要注意一下,MEDIA_ROOT和MEDIA_URL。

MEDIA_ROOT是媒体文件的上传位置根目录,由于设置了BUCKET_NAME,一般在这个bucket中。可以设置为空字符串。

文件自然上传到Django模版的FileField字段设置的upload_to位置。

MEDIA_URL是获取媒体文件的链接前缀,可根据自己的oss文件链接位置添加。

由于上传的文件需要开放被用户下载,BUCKET_ACL_TYPE设置为公共的。若你的静态文件也需要上传到OSS中,设置如下:

设置无误后,重启Django即可使用。上传文件将自动上传到OSS中。

上面提到我要修改里面的源码。因为发现上传的文件在下载时的文件名是一串乱码,不是上传时的文件名。这个需要设置一些header信息,可参考OSS的SDK文档。该header需要在上传文件时就提交,而上面的django-aliyun-oss2-storage在上传文件时没有写入header信息。

打开该包的源码文件backends.py,找到AliyunBaseStorage类的_save方法。修改如下:

这样设置,点击文件链接,即可下载并且下载文件名是上传的文件名。若你不是什么类型文件都需要这么处理,可以判断filename的后缀名加以处理。

上一篇:没有了
技术干货
零基础学习
行业多年深耕,从这报名,学费立减800
  • 岳同学180****1241刚刚成功领取
  • 胡同学134****6431刚刚成功领取
  • 李同学150****6122刚刚成功领取
  • 张同学136****2231刚刚成功领取
  • 孙同学178****5521刚刚成功领取
  • 齐同学156****7788刚刚成功领取
猜你喜欢
查看更多
相关推荐
查看更多
现在学习,我的薪资能达到多少?
立即报名

联系我们:

Q:2638333071

鄂ICP备2023015464号