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实现的凯撒密码算法示例
Apr 12 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
python进行文件对比的方法
Dec 24 Python
Python可变和不可变、类的私有属性实例分析
May 31 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
pycharm中显示CSS提示的知识点总结
Jul 29 Python
Django继承自带user表并重写的例子
Nov 18 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python中字符串的编码与解码详析
Dec 03 Python
Python学习之包与模块详解
Mar 19 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
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
event.srcElement+表格应用
2006/08/29 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
Python获取网页上图片下载地址的方法
2015/03/11 Python
python常规方法实现数组的全排列
2015/03/17 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
20岁生日感言
2014/01/13 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Python机器学习之基础概述
2021/05/19 Python
Redis 常见使用场景
2021/08/30 Redis
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers