Django学习之文件上传与下载


Posted in Python onOctober 06, 2019

本文实例为大家分享了Django文件上传与下载的具体代码,供大家参考,具体内容如下

文件上传

1.新建django项目,创建应用stu: python manage.py startapp stu

2.在配置文件setting.py INSTALLED_APP 中添加新创建的应用stu

3.配置urls,分别在test\urls 和子路由stu\urls 中

#test\urls
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^student/',include('stu.urls'))
]

#stu\urls
from django.conf.urls import url
import views

urlpatterns=[
 url(r'^$',views.index_view)
]

4.创建视图文件index_view.py

def index_view(request):
 if request.method=='GET':
 return render(request,'index.html')
 elif request.method=='POST':
 uname = request.POST.get('uname','')
 photo = request.FILES.get('photo','')
 import os
 if not os.path.exists('media'): #判断是否存在文件media,不存在则创建一个
  os.makedirs('media')
 with open(os.path.join(os.getcwd(),'media',photo.name),'wb') as fw: #以读的方式打开目录为/media/photo.name 的文件 别名为fw
  fw.write(photo.read()) #读取photo文件并将其写入(一次性读取完)


 for chunk in fw.chunks:
  
fw.write(chunk)
 return HttpResponse('注册成功')
 else:
 return HttpResponse('页面跑丢了,稍后再试!')

5.创建模板文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form action="/student/" method="post" enctype="multipart/form-data">
 {% csrf_token %}
 <p>
 <lable>姓名:<input type="text" name ='uname'></lable>
 </p>
 <p>
 <lable>头像:<input type="file" name ='photo'></lable>
 </p>
 <p>
 <lable><input type="submit" value="注册"></lable>
 </p>
</form>
</body>
</html>

文件存在数据库中并查询所有信息

1.创建模型类

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.
from django.db import models
class Student(models.Model):
 sid = models.AutoField(primary_key=True)
 sname = models.CharField(max_length=30)
 photo = models.ImageField(upload_to='img')
 class Meta:
 db_table='t_stu'

 def __unicode__(self):
 return u'Student:%s' %self.sname

2.修改配置文件setting.py 添加新内容

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

3.通过创建的模型类 来映射数据库表

python mange.py makemigrations stu

python mange.py migrate

4.添加新的子路由地址

urlpatterns=[
 url(r'^$',views.index_view),
 url(r'^upload/$',views.upload_view),
 url(r'^show/$',views.showall_view)
]

5.在views文件中添加新的函数 showall_view()

def upload_view(request):
 uname = request.POST.get('uname','')
 photo = request.FILES.get('photo','')
 #入库操作
 Student.objects.create(sname = uname,photo=photo)
 return HttpResponse('上传成功')

def showall_view(request):

 stus = Student.objects.all()
 return render(request,'show.html',{'stus':stus})

6.创建模板 显示查询到所有的信息

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<table border="1" width="500px" cellspacing="0">
 <tr>
 <th>编号</th>
 <th>姓名</th>
 <th>图片</th>
 <th>操作</th>
 </tr>
 <tr>
 {% for stu in stus %}
  <td>{{ forloop.counter }}</td>
  <td>{{ stu.sname }}</td>
  <td><img src="{{ MEDIA_URL}}{{ stu.photo }}"/> </td>
  <td><a href="#" rel="external nofollow" >操作</a></td>
 {% endfor %}
 </tr>
</table>
</body>
</html>

7.配置根路由 test\urls.py 读取后台上传的文件

from django.views.static import serve

if DEBUG:
 urlpatterns+=url(r'^media/(?P<path>.*)/$', serve, {"document_root": MEDIA_ROOT}),

8.再次修改配置文件setting.py  在TEMPLATE中添加新的内容 可以获取到media中的内容

'django.template.context_processors.media'

9.访问127.0.0.1:8000/student/ 上传学生信息

访问127.0.0.1:8000/student/show/ 查看所有学生的信息

文件的下载

1.配置子路由 访问views.py 下的download_view()函数

urlpatterns=[
 url(r'^$',views.index_view),
 url(r'^upload/$',views.upload_view),
 url(r'^show/$',views.showall_view),
 url(r'^download/$',views.download_view)
]
import os
def download_view(request):
 #获取文件存放的位置
 filepath = request.GET.get('photo','')
 print filepath
 #获取文件的名字
 filename = filepath[filepath.rindex('/')+1:]
 print filename
 path = os.path.join(os.getcwd(),'media',filepath.replace('/','\\'))
 with open(path,'rb') as fr:
 response = HttpResponse(fr.read())
 response['Content-Type'] = 'image/png'
 # 预览模式
 response['Content-Disposition'] = 'inline;filename=' + filename
 # 附件模式
 response['Content-Disposition']='attachment;filename='+filename
 return response

2.修改show.html 文件中下载栏的超链接地址

<tr>
 {% for stu in stus %}
  <td>{{ forloop.counter }}</td>
  <td>{{ stu.sname }}</td>
  <td><img src="{{ MEDIA_URL}}{{ stu.photo }}"/> </td>
  <td><a href="/student/download/?photo={{ stu.photo }}" rel="external nofollow" >下载</a></td>
 {% endfor %}
</tr>

3.访问127.0.0.1:8000/studnet/show/ 查看学生信息

点击操作栏中的下载 即可将学生照片下载到本地

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 字典dict使用介绍
Nov 30 Python
python实现端口转发器的方法
Mar 13 Python
Python中转换角度为弧度的radians()方法
May 18 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python读取和保存图片5种方法对比
Sep 12 Python
Python日志logging模块功能与用法详解
Apr 09 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python实现双链表
May 25 Python
Django实现文件上传和下载功能
Oct 06 #Python
Django文件上传与下载(FileFlid)
Oct 06 #Python
Django实现文件上传下载
Oct 06 #Python
python编写猜数字小游戏
Oct 06 #Python
python实现猜数字游戏
Mar 25 #Python
python实现机器人卡牌
Oct 06 #Python
Django实现文件上传下载功能
Oct 06 #Python
You might like
php.ini 中文版
2006/10/28 PHP
php生成缩略图的类代码
2008/10/02 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python实现简单过滤文本段的方法
2017/05/24 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
python的setattr函数实例用法
2020/12/16 Python
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
体现团队精神的口号
2014/06/06 职场文书
企业整改报告范文
2014/11/08 职场文书
资金申请报告范文
2015/05/14 职场文书
新闻通讯稿范文
2015/07/22 职场文书
主婚人致辞精选
2015/07/28 职场文书
css3 选择器
2022/05/11 HTML / CSS