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 01 Python
Python实现简单的四则运算计算器
Nov 02 Python
Python中正则表达式详解
May 17 Python
Python使用asyncio包处理并发详解
Sep 09 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Django密码系统实现过程详解
Jul 19 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
Python 正则表达式爬虫使用案例解析
Sep 23 Python
python 如何调用 dubbo 接口
Sep 24 Python
python实现批量移动文件
Apr 05 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 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
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
javascript 日期时间 转换的方法
2013/02/21 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
js用类封装pop弹窗组件
2017/10/08 Javascript
vue小白入门教程
2018/04/02 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
python基础教程之Filter使用方法
2017/01/17 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python通过future处理并发问题
2017/10/17 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
pow在python中的含义及用法
2019/07/11 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python ini文件常用操作方法解析
2020/04/26 Python
Python try except else使用详解
2021/01/12 Python
Django视图类型总结
2021/02/17 Python
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
大学毕业生通用自我评价
2014/01/05 职场文书
《口技》教学反思
2014/02/21 职场文书
保护环境倡议书100字
2014/05/19 职场文书
美食节策划方案
2014/05/26 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
安全检查汇报材料
2014/12/26 职场文书
技术员个人工作总结
2015/03/03 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js