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网络爬虫采集联想词示例
Feb 11 Python
python多线程编程中的join函数使用心得
Sep 02 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
学python安装的软件总结
Oct 12 Python
python实现WebSocket服务端过程解析
Oct 18 Python
Python之变量类型和if判断方式
May 05 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
bat批处理之字符串操作的实现
Mar 16 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
推荐:极酷右键菜单
2006/11/29 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
JS重载实现方法分析
2016/12/16 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Python正则表达式学习小例子
2020/03/03 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
2014年健康教育实施方案
2014/02/17 职场文书
地道战观后感400字
2015/06/04 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
详解Python中的进程和线程
2021/06/23 Python
python多次执行绘制条形图
2022/04/20 Python
JS高级程序设计之class继承重点详解
2022/07/07 Javascript