python 实现上传图片并预览的3种方法(推荐)


Posted in Python onJuly 14, 2017

在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览。

常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面;另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存。

这两种方法各有利弊,方法一很明显,浪费流量和服务器资源;方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高(在某些低版本中的IE浏览器不支持)。

以下是实现上述思路的方法:

1. 模板文件

test.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div >
    <form action="">
      {% csrf_token %}
    <h3>用户注册</h3>
    <p>用户名:<input type="text" name="userName"></p>
    <p>密码:<input type="password" name="password"></p>
    <p>邮箱:<input type="text" name="email"></p>
      <input id="avatar" type="text" value="/static/images/sample.png" name="avatar" > {# 实际应用中要将该input标签隐藏,display:none; #}
      <p><input type="submit" value="注册"></p>
      </form>
    <div >
    <input id="avatarSlect" type="file" >
    <img id="avatarPreview" src="/static/images/sample.png" title="点击更换图片" >
      </div>
  </div>
</body>

<script src="/static/jquery-3.2.1.js"></script>
<script>
  $(function () {
      bindAvatar();
 });
  function bindAvatar() {
      if(window.URL.createObjectURL){
        bindAvatar3();
      }else if(window.FileReader){
        bindAvatar2();
      }else {
        bindAvatar1();
      }
 }

  /*Ajax上传至后台并返回图片的url*/
  function bindAvatar1() {
    $("#avatarSlect").change(function () {
    var csrf = $("input[name='csrfmiddlewaretoken']").val();
    var formData=new FormData();
    formData.append("csrfmiddlewaretoken",csrf);
    formData.append('avatar', $("#avatarSlect")[0].files[0]);  /*获取上传的图片对象*/
    $.ajax({
      url: '/upload_avatar/',
          type: 'POST',
          data: formData,
          contentType: false,
          processData: false,
          success: function (args) {
        console.log(args);  /*服务器端的图片地址*/
              $("#avatarPreview").attr('src','/'+args);  /*预览图片*/
              $("#avatar").val('/'+args);  /*将服务端的图片url赋值给form表单的隐藏input标签*/
     }
      })
 })
  }
  /*window.FileReader本地预览*/
  function bindAvatar2() {
    console.log(2);
       $("#avatarSlect").change(function () {
           var obj=$("#avatarSlect")[0].files[0];
           var fr=new FileReader();
           fr.onload=function () {
               $("#avatarPreview").attr('src',this.result);
               console.log(this.result);
               $("#avatar").val(this.result);
      };
      fr.readAsDataURL(obj);
    })
 }
 /*window.URL.createObjectURL本地预览*/
 function bindAvatar3() {
   console.log(3);
      $("#avatarSlect").change(function () {
          var obj=$("#avatarSlect")[0].files[0];
          var wuc=window.URL.createObjectURL(obj);
           $("#avatarPreview").attr('src',wuc);
           $("#avatar").val(wuc);
{#           $("#avatarUrl").load(function () {#}    /*当图片加载后释放内存空间,但在jQuery3.2.1中会报错。浏览器关闭后也会自动释放*/
{#               window.URL.revokeObjectURL(wuc);#}
{#      })#}
   })
 }

</script>
</html>

2. 视图函数

upload_avatar.py

from django.shortcuts import render, HttpResponse


def test(request):
  return render(request, 'test.html')


def upload_avatar(request):
  file_obj = request.FILES.get('avatar')
  file_path = os.path.join('static/images', file_obj.name)
  with open(file_path, 'wb') as f:
    for chunk in file_obj.chunks():
      f.write(chunk)
  return HttpResponse(file_path)

3. 路由系统

urls.py

from django.conf.urls import url
from django.contrib import admin
from home import views as homeViews

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^upload_avatar/', homeViews.upload_avatar), # 上传头像
  url(r'^test/', homeViews.test), # 测试页面
]

验证效果:

选择图片前:

python 实现上传图片并预览的3种方法(推荐)

Ajax上传图片至服务器,并返回浏览器该图片的url:

python 实现上传图片并预览的3种方法(推荐)

window.FileReader本地预览,form表单提交:

python 实现上传图片并预览的3种方法(推荐)

window.URL.createObjectURL本地预览,form表单提交:

python 实现上传图片并预览的3种方法(推荐)

以上这篇python 实现上传图片并预览的3种方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 获取本机ip地址的两个方法
Feb 25 Python
Python中非常实用的一些功能和函数分享
Feb 14 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
便捷提取python导入包的属性方法
Oct 15 Python
python重试装饰器的简单实现方法
Jan 31 Python
Python for循环与range函数的使用详解
Mar 23 Python
用Python实现将一张图片分成9宫格的示例
Jul 05 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
用Python实现Newton插值法
Apr 17 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
Python利用FlashText算法实现替换字符串
Mar 31 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 #Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 #Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 #Python
简单易懂的python环境安装教程
Jul 13 #Python
Python2.7读取PDF文件的方法示例
Jul 13 #Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 #Python
python3 模拟登录v2ex实例讲解
Jul 13 #Python
You might like
坏狼的PHP学习教程之第1天
2008/06/15 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
vue之数据交互实例代码
2017/06/20 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python解析xml模块封装代码
2014/02/07 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
python3中int(整型)的使用教程
2017/03/23 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
string = null 和string = ''的区别
2013/04/28 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
可怜妈妈观后感
2015/06/09 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python