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 相关文章推荐
pygame播放音乐的方法
May 19 Python
详解Python中的strftime()方法的使用
May 22 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
python异常处理和日志处理方式
Dec 24 Python
opencv python图像梯度实例详解
Feb 04 Python
python如何建立全零数组
Jul 19 Python
python的flask框架难学吗
Jul 31 Python
Python基础之元组与文件知识总结
May 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
PHP中cookies使用指南
2007/03/16 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
基于php判断客户端类型
2016/10/14 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
js版本A*寻路算法
2006/12/22 Javascript
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
JavaScript闭包相关知识解析
2019/10/19 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
自荐书范文
2013/12/08 职场文书
加拿大留学自荐信
2014/01/28 职场文书
化妆品促销方案
2014/02/24 职场文书
出纳会计岗位职责
2014/03/12 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
学校督导评估方案
2014/06/10 职场文书
2014年妇女工作总结
2014/12/06 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang