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中的线程进行网络编程的入门教程
Apr 15 Python
简单解决Python文件中文编码问题
Nov 22 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
Python中装饰器高级用法详解
Dec 25 Python
python编程嵌套函数实例代码
Feb 11 Python
python 处理string到hex脚本的方法
Oct 26 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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 搜索框提示(自动完成)实例代码
2012/02/05 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
javascript获取当前ip的代码
2009/05/10 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
js调用设备摄像头的方法
2018/07/19 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
python解析xml文件实例分析
2015/05/27 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Django 外键的使用方法详解
2019/07/19 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
党员先锋岗事迹材料
2014/05/08 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
道歉的话怎么说
2015/05/12 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
Python基础 括号()[]{}的详解
2021/11/07 Python