Django 实现图片上传和下载功能


Posted in Python onDecember 31, 2020

原生上传图片方式

#新建工程 
python manage.py startapp test30
#修改 settings.py
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'stu'
]
#修改urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'student/',include('stu.urls')),
]
#新增加 stu/urls.py 
#coding:utf-8
from django.conf.urls import url
import views
urlpatterns = [
  url(r'^$',views.index_view)
]
#编辑 stu/views.py 
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
#原生上传文件方式
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','')
    print photo.name
    import os
    print os.getcwd()
    if not os.path.exists('media'):
       os.mkdir('media')
    #拼接路径
    with open(os.path.join(os.getcwd(),'media',photo.name),'wb') as fw:
      # photo.read() #一次性读取文件到内存
      # fw.write(photo.read())

      #分块读取,性能高
      for ck in photo.chunks():
        fw.write(ck)

    return HttpResponse('It is post request,上传成功')

  else:
    return HttpResponse('It is not post and get request!')
#新增加模板文件 templates/index.html
<!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>
    <label for="ua">姓名: </label> <input type="text" name="uname" id="ua"/>
  </p>
  <p>
    <label for="ph">头像: </label> <input type="file" name="photo" id="ph"/>
  </p>
  <p>
         <input type="submit" value="注册"/>
  </p>
</form>
</body>
</html>
#效果如下:
访问: http://127.0.0.1:8000/student/

Django 实现图片上传和下载功能

Django 实现图片上传和下载功能

Django 实现图片上传和下载功能

Django 图片上传方式

需求:
效果: 访问 http://127.0.0.1:8000/student/ 通过注册将姓名、头像地址传入数据库中;
访问 http://127.0.0.1:8000/student/showall 将数据库信息通过表格形式展示

###过程
#修改 settings.py ,templates 新增加 'django.template.context_processors.media'
TEMPLATES = [
  {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')]
    ,
    'APP_DIRS': True,
    'OPTIONS': {
      'context_processors': [
        'django.template.context_processors.debug',
        'django.template.context_processors.request',
        'django.contrib.auth.context_processors.auth',
        'django.contrib.messages.context_processors.messages',
        'django.template.context_processors.media'
      ],
    },
  },
]

末尾增加:
# global_settings
#指定上传文件存储相对路径(读取文件)
MEDIA_URL = '/media/'
#指定上传文件存储绝对路径(存储文件)
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

#创建数据库模型 stu/models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

class Student(models.Model):
  sno = models.AutoField(primary_key=True)
  sname = models.CharField(max_length=30)
  photo = models.ImageField(upload_to='imgs')

  def __unicode__(self):
    return u'Student:%s'%self.sname
#生成数据库迁移文件,查看数据库表结构
python makemigrations stu
python migrate 


#修改 urls.py 因为显示问题,增加 DEBUG 内容
from django.conf.urls import url, include
from django.contrib import admin

from test30.settings import DEBUG, MEDIA_ROOT

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'student/',include('stu.urls')),
]
from django.views.static import serve
if DEBUG:
  urlpatterns+=url(r'^media/(?P<path>.*)/$', serve, {"document_root": MEDIA_ROOT}),

#修改 urls, stu/urls.py
#coding:utf-8
from django.conf.urls import url
import views
urlpatterns = [
  url(r'^$',views.index_view),
  url(r'^upload/$',views.upload_view),
  url(r'^showall/$',views.showall_view)
]

# 修改 stu/views.py
#django 上传文件方式
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()
  print stus
  return render(request,'show.html',{'stus':stus})

# 修改 index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<form action="/student/upload/" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <p>
    <label for="ua">姓名: </label> <input type="text" name="uname" id="ua"/>
  </p>
  <p>
    <label for="ph">头像: </label> <input type="file" name="photo" id="ph"/>
  </p>
  <p>
         <input type="submit" value="注册"/>
  </p>
</form>
</body>
</html>
# 增加模板文件 show.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<table width="500px" border="1" cellspacing="0">
  <tr>
    <th>编号</th>
    <th>姓名</th>
    <th>头像</th>
    <th>操作</th>
  </tr>
  {% for stu in stus %}
  <tr>
  <td>{{ forloop.counter }}</td>
  <td>{{ stu.sname }}</td>
  <td><img style="width: 200px;" src="{{ MEDIA_URL }}{{ stu.photo }}"/></td>
  <td> 下载</td>
  </tr>
  {% endfor %}

</table>
</body>
</html>
效果图:
http://127.0.0.1:8000/student/ 注册实现数据库录入操作(点击提交通过index.html 中action="/student/upload/" 将url 转发至函数upload_view ,实现上传功能)
http://127.0.0.1:8000/student/showall/ 实现数据库信息展示

Django 实现图片上传和下载功能

Django 实现图片上传和下载功能

图片下载功能

### 需求
在显示页面点击下载实现图片的下载功能
过程:

#修改 show.html ,加入 下载的超链接
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<table width="500px" border="1" cellspacing="0">
  <tr>
    <th>编号</th>
    <th>姓名</th>
    <th>头像</th>
    <th>操作</th>
  </tr>
  {% for stu in stus %}
  <tr>
  <td>{{ forloop.counter }}</td>
  <td>{{ stu.sname }}</td>
  <td><img style="width: 200px;" src="{{ MEDIA_URL }}{{ stu.photo }}"/></td>
  <td><a href="/student/download/?photo={{ stu.photo }}" rel="external nofollow" >下载</a></td>
  </tr>
  {% endfor %}

</table>
</body>
</html>


#因为 show.html href="/student/download ,所以要修改urls
#修改 stu/urls.py,新增加 url
url(r'^download/$',views.download_view)

#修改 stu/views.py

def download_view(request):
  # 获取请求参数(图片存储位置) imgs/5566.jpg
  photo = request.GET.get('photo','')
  print photo

  # 获取图片文件名5566.jpg ; rindex 为字符 '/' 在 photo 中最后出现的位置索引;例如
  # txt = "imgs/5566.jpg"
  # x = txt.rindex("/")
  # print txt[x + 1:]  输出结果为 5566.jpg
  filename = photo[photo.rindex('/')+1:]
  print filename
  #开启一个流
  import os
  path = os.path.join(os.getcwd(),'media',photo.replace('/','\\'))
  print path

  with open(path,'rb') as fr:
    response = HttpResponse(fr.read())
    response['Content-Type']='image/png'
    response['Content-Disposition'] = 'attachment;filename=' + filename

  return response

#访问 http://127.0.0.1:8000/student/showall/ ,点击下载

Django 实现图片上传和下载功能

以上就是Django 实现图片上传和下载功能的详细内容,更多关于Django 图片上传和下载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
从零学python系列之从文件读取和保存数据
May 23 Python
在Python中编写数据库模块的教程
Apr 29 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
如何使用python进行pdf文件分割
Nov 11 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
python对文件的操作方法汇总
Feb 28 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Python wordcloud库安装方法总结
Dec 31 #Python
Python的信号库Blinker用法详解
Dec 31 #Python
浅析python实现动态规划背包问题
Dec 31 #Python
python中doctest库实例用法
Dec 31 #Python
Python项目打包成二进制的方法
Dec 30 #Python
Python 实现RSA加解密文本文件
Dec 30 #Python
python之随机数函数的实现示例
Dec 30 #Python
You might like
PHP 截取字符串专题集合
2010/08/19 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
朴素贝叶斯算法的python实现方法
2014/11/18 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python 装饰器使用详解
2017/07/29 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
python分数表示方式和写法
2019/06/26 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
关于圣诞节的广播稿
2014/01/26 职场文书
有关爱国演讲稿
2014/05/07 职场文书
村委会贫困证明范本
2014/09/17 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
销售助理岗位职责
2015/02/11 职场文书
护士先进个人总结
2015/02/13 职场文书
药品开票员岗位职责
2015/04/15 职场文书
会计试用期工作总结2015
2015/05/28 职场文书