django 文件下载
1. 最简单下载:将文件流放入HttpResponse对象即可,适合小文件的下载,但如果这个文件非常大,这种方式会占用大量. 如:
def file_download(request):
# do something...
with open('file_name.txt') as f:
c = f.read()
return HttpResponse(c)
2. 合理的文件下载
Django的HttpResponse对象允许将迭代器作为传入参数,将上面代码中的传入参数c换成一个迭代器 ,便可以将上述下载功能优化为对大小文件均适合.更加合理的文件下载功能,应该先写一个迭代器,用于处理文件, 然后将这个迭代器作为参数传递给StreaminghttpResponse对象,如:
from django.http import StreamingHttpResponse def big_file_download(request):
# do something... def file_iterator(file_name, chunk_size=):
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
3.最优文件下载
上述的代码,已经完成了将服务器上的文件,通过文件流传输到浏览器,但文件流通常会以乱码形式显示到浏览器中, 而非下载到硬盘上,因此,还要在做点优化,让文件流写入硬盘。优化很简单,给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=):
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
4.文件名包含中文下载时文件名不对,原因是: url编码解码 ,解决方法如下
from django.utils.http import urlquote response[‘Content-Disposition‘] = ‘attachment;filename="%s"‘ % (urlquote(title))
5. 遇到的问题:
下面可以下载成功:
def cmdb_export(request):
"""
下载文件,发调用写好的 下载文件的 函数总是报错,直接写过来没问题.
:param request:
:return:
"""
if request.method=="GET":
print("导出ip...........hosts")
dir_create()
remove_file("hosts")
obj = ServerConfInfo.objects.filter(deleted=False)
for i in obj:
filename = file_creat(file_name='hosts', mode="a", content=i.ip_net) response = StreamingHttpResponse(file_iterator(filename))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(filename)
return response else:
pass
可是改成调用写好的下载函数就报错 didn't return an HttpResponse object. It returned None instead
def cmdb_export(request):
"""
下载文件,发调用写好的 下载文件的 函数总是报错,直接写过来没问题.
:param request:
:return:
"""
if request.method=="GET":
print("导出ip...........hosts")
dir_create()
remove_file("hosts")
obj = ServerConfInfo.objects.filter(deleted=False)
for i in obj:
filename = file_creat(file_name='hosts', mode="a", content=i.ip_net) dj_downloadfile(request,filename) ##这里调用写好的下载函数。
# txt = file_iterator(filename)
# response = StreamingHttpResponse(file_iterator(filename))
# response['Content-Type'] = 'application/octet-stream'
# response['Content-Disposition'] = 'attachment;filename="{0}"'.format(filename)
# return response else:
pass
dj_downloadfile()函数如下:
def dj_downloadfile(request,filename):
"""
网页下载数据,发现引用该函数会出现错误,但是把代码拷贝过去是正常的.
:param request:
:param filename:
:return:
"""
response = StreamingHttpResponse(file_iterator(filename))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(filename)
return response
django 文件下载的更多相关文章
- Django 文件下载功能
def file_download(request): con= MySQLdb.connect(host='192.168.xxx.xxx',user='root',passwd='xxxx',db ...
- 【Django】Django 文件下载最佳实践
代码: from django.http import StreamingHttpResponse def big_file_download(request): # do something... ...
- python Django 文件下载示例
from django.http import StreamingHttpResponse#文件流 def big_file_download(request): # do something... ...
- Django 大文件下载
django提供文件下载时,若果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入Response对象中: def simple_file_download(request): # ...
- html、js简单实现含中文csv文件下载(后端为django)
1.在django views.py中使用HttpResponse views.py首行加上utf-8编码,将默认unicode编码变为utf-8 # -*- coding:utf-8 -*- 下面 ...
- django三种文件下载方式
一.概述 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. ...
- django 实现文件下载功能
一.概述 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. ...
- 详解django三种文件下载方式
推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse的子类,内部使用迭代器进行数据流传输. 在实际的项目中很多时候需要用到下载功能,如 ...
- django 文件上传(阿里云oss)下载(支持大文件下载)
1.文件上传 Models 设计 class Upload_File(models.Model): image = models.FileField(upload_to='file/%Y/%m',de ...
随机推荐
- 海康JAVA SDK库动态路径加载
海康JAVA SDK初始化路径默认是放在classes下面,见下: HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK&q ...
- web中绝对路径换虚拟路径
最近在做一个web项目,将图片上传到服务器后,再访问时拿到的是绝对路劲,而需要的是虚拟路劲.经过一番折腾找到了下列方法可以直接转换. /// <summary> /// 将W ...
- mixins,generics(ApiView)
#生成序列化对象class BookModelSerizter(serializers.ModelSerializer): class Meta: model=Book fields='__all__ ...
- iOS NSArray 的count方法返回的是无符号整形!
){ return cell; } 这样写是错误的!!!当数组为空时,由于count方法返回的是无符号整形,没有负数,self.requests.count -1是一个非常大的正数! 正确写法: &g ...
- Linux 的 OOM 终结者(Out Of Memory killer)
现在是早晨6点钟.已经醒来的我正在总结到底是什么事情使得我的起床闹铃提前了这么多.故事刚开始的时候,手机铃声恰好停止.又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点.然 ...
- CDH 元数据库升级
元数据库设计到的服务:scm库:server hive库:hive amon库:cloudera management服务 元数据库要从5.7.24升级到5.7.25,为了避免升级失败导致 集群不 ...
- Linux下的启动oracle的EM的命令
Linux下的启动oracle的EM的命令 1.启动数据库 su - oracle $sqlplus / as sysdba sql>startup 2.启动监听 $lsnrctl LSNRCT ...
- 第二十单元 计划任务crond服务
什么是计划任务:后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好.这就用到了crond服务 crond服务相关的软件包[root@MiWiFi-R3-srv ~]# rpm ...
- eclipse的安装及使用
1.安装 2工作区 3透视图添加透视图 关闭和显示各个子视图 点击视图右上角的关闭按钮可以关闭当前视图 可以选择Window-->Show View菜单项打开各个子视图 4创建项目 选择File ...
- centos--git搭建之Gogs安装
1.下载git yum intall -y git 2. 创建git用户(必须新创建git用户, 用root用户会导致无法下载) #创建git用户 sudo adduser git #给git用户设置 ...