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模块restful使用方法实例
Dec 10 Python
python删除列表中重复记录的方法
Apr 28 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
python实时监控cpu小工具
Jun 21 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
pandas 缺失值与空值处理的实现方法
Oct 12 Python
python异常处理和日志处理方式
Dec 24 Python
用python拟合等角螺线的实现示例
Dec 27 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
用python获取txt文件中关键字的数量
Dec 24 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP生成静态页
2006/11/25 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
php object转数组示例
2014/01/15 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
用python 制作图片转pdf工具
2015/01/30 Python
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
Python网站验证码识别
2016/01/25 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
初级Java程序员面试题
2016/03/03 面试题
药学专业学生的自我评价分享
2014/02/06 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
甘南现象心得体会
2014/09/11 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
小学总务工作总结
2015/08/13 职场文书
Python进度条的使用
2021/05/17 Python
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL