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 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python实现模拟时钟代码推荐
Nov 08 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 Python
Python虚拟环境项目实例
Nov 20 Python
教你使用python画一朵花送女朋友
Mar 29 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
通过Pandas读取大文件的实例
Jun 07 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
python替换字符串中的子串图文步骤
Jun 19 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 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
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php cookie 详解使用实例
2016/11/03 PHP
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JavaScript中的this机制
2016/01/30 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
python logging类库使用例子
2014/11/22 Python
Python实现堆排序的方法详解
2016/05/03 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
python pillow模块使用方法详解
2019/08/30 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
HTML5实现视频弹幕功能
2019/08/09 HTML / CSS
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
海飞丝广告词
2014/03/20 职场文书
煤矿安全承诺书
2014/05/22 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书