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守护进程用法实例分析
Jun 04 Python
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
详解Python中类的定义与使用
Apr 11 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
python抽取指定url页面的title方法
May 11 Python
Python列表生成式与生成器操作示例
Aug 01 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
Python测试线程应用程序过程解析
Dec 31 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
Python如何输出警告信息
Jul 30 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 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在字符串中查找另一个字符串
2008/11/19 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
php测试kafka项目示例
2020/02/06 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
安装Python的教程-Windows
2017/07/22 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python实现的计算器功能示例
2018/04/26 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Python 爬虫的原理
2020/07/30 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
工艺工程师工作职责
2013/11/23 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
合作协议书范本
2014/04/17 职场文书
优秀党员先进材料
2014/12/18 职场文书
会计专业自荐信范文
2015/03/05 职场文书
护士医德医风心得体会
2016/01/25 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
导游词之临安白水涧
2019/11/05 职场文书