Django实现文件上传下载


Posted in Python onOctober 06, 2019

本文实例为大家分享了Django实现文件上传下载的具体代码,供大家参考,具体内容如下

一、django实现文件下载

(1)、后台接口

如果从服务器直接将文件路径传给浏览器,普通文件可以直接下载,而图片,html,css和pdf格式等文件会直接显示,所以解决办法就是在头文件中让文件流写入硬盘.

①、最简单的文件下载功能的实现,直接将文件流放入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字段赋下面的值即可

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

(2)、前台展示

①、使用a标签直接访问到上面的视图函数配置好的url即可

②、使用button,或者其他标签

使用js触发点击事件,代码如下:

$("body").on("click",".buttonimgdown",function(){
 alert($(".hiddenshiyan").val());
 location.href="/downloadFile/?url=" rel="external nofollow" +$(".hiddenshiyan").val();
});

二 文件上传

(1)、前台表单,使用表单的方式进行文件的上传

<form enctype="multipart/form-data" action="./upload" method="post">
<p>File: <input type="file" name="file"></p>
<p><input type="submit" value="Upload"></p>
</form>

(2)、后台接收,这是接收图片的代码,其他文件类似

def addOnepicture(req):
rollpicturePath=os.path.join(basePath,rollpictureName)
reqfile = req.FILES['picfile']
img = Image.open(reqfile)
img.thumbnail((500,500),Image.ANTIALIAS)#对图片进行等比缩放
img.save(rollpicturePath,"png")#保存图片
T_Picture.objects.create(<u>...</u>)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
小结Python用fork来创建子进程注意事项
Jul 03 Python
Python自动连接ssh的方法
Mar 07 Python
Python中用于计算对数的log()方法
May 15 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
python 第三方库的安装及pip的使用详解
May 11 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
Django框架模板介绍
Jan 15 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
Python常用外部指令执行代码实例
Nov 05 Python
python编写猜数字小游戏
Oct 06 #Python
python实现猜数字游戏
Mar 25 #Python
python实现机器人卡牌
Oct 06 #Python
Django实现文件上传下载功能
Oct 06 #Python
使用turtle绘制五角星、分形树
Oct 06 #Python
wxPython:python首选的GUI库实例分享
Oct 05 #Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 #Python
You might like
正则表达式语法
2006/10/09 Javascript
phpfans留言版用到的install.php
2007/01/04 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
深入理解PHP中的count函数
2016/05/31 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
vue组件实例解析
2017/01/10 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
python版百度语音识别功能
2019/07/09 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
美国翻新电子产品商店:The Store
2019/10/08 全球购物
单位办理社保介绍信
2014/01/10 职场文书
20年同学聚会感言
2014/02/03 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
小学教师党员承诺书
2015/04/27 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
收入证明范本
2015/06/12 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
Python使用openpyxl模块处理Excel文件
2022/06/05 Python
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL