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中mechanize库的简单使用示例
Jan 10 Python
Python字典操作简明总结
Apr 13 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
python版学生管理系统
Jan 10 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python List列表对象内置方法实例详解
Oct 22 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
Python JSON常用编解码方法代码实例
Sep 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
php正则
2006/07/07 PHP
php+mysql分页代码详解
2008/03/27 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python实现通过继承覆盖方法示例
2018/07/02 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
初中毕业生自我评价
2015/03/02 职场文书
优秀员工自荐书
2015/03/06 职场文书
综合办公室岗位职责
2015/04/11 职场文书
党支部鉴定意见
2015/06/02 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
详解Python中的for循环
2022/04/30 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL