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连接sql server乱码的解决方法
Jan 28 Python
基于Python实现的百度贴吧网络爬虫实例
Apr 17 Python
python文件的md5加密方法
Apr 06 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
Python用input输入列表的实例代码
Feb 07 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 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
珊瑚虫IP库浅析
2007/02/15 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
移动节点的jquery代码
2014/01/13 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python类属性与实例属性用法分析
2015/05/09 Python
Python断言assert的用法代码解析
2018/02/03 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
python爬虫之自制英汉字典
2019/06/24 Python
python zip()函数的使用示例
2020/09/23 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
2015年消防工作总结
2015/04/24 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
校园开放日新闻稿
2015/07/17 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python