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入门篇之正则表达式
Oct 20 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
python paramiko模块学习分享
Aug 23 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
PyMongo 查询数据的实现
Jun 28 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
python getopt详解及简单实例
2016/12/30 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
python开发入门——set的使用
2020/09/03 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
举例说明类变量和实例变量的区别
2016/06/30 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
合同意向书范本
2014/07/30 职场文书
营销学习心得体会
2014/09/12 职场文书