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使用metaclass实现Singleton模式的方法
May 05 Python
Python实现遍历数据库并获取key的值
May 17 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python实现调度算法代码详解
Dec 01 Python
tensorflow构建BP神经网络的方法
Mar 12 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
Python连接Redis的基本配置方法
Sep 13 Python
Python跳出多重循环的方法示例
Jul 03 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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
基于mysql的论坛(5)
2006/10/09 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
JS定时器实例详细分析
2013/10/11 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python的id()函数解密过程
2012/12/25 Python
python控制台中实现进度条功能
2015/11/10 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
pandas数据处理之绘图的实现
2020/06/15 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
教师个人自我鉴定
2014/02/08 职场文书
行政部岗位职责范本
2014/03/13 职场文书
求职自荐信的格式
2014/04/07 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
导游词怎么写
2015/02/04 职场文书
资产移交协议书
2016/03/24 职场文书
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL