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程序退出方式小结
Dec 09 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
详解django中url路由配置及渲染方式
Feb 25 Python
python 字符串常用方法汇总详解
Sep 16 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
Python描述符descriptor使用原理解析
Mar 21 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
python 实现Harris角点检测算法
Dec 11 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调用Java对象的方法
2006/10/09 PHP
PHP 调试工具Debug Tools
2011/04/30 PHP
PHP禁止页面缓存的代码
2011/10/23 PHP
php缓存技术详细总结
2013/08/07 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
js轮播图代码分享
2016/07/14 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
AngularJS的脏检查深入分析
2017/04/22 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
python计数排序和基数排序算法实例
2014/04/25 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
python每天定时运行某程序代码
2019/08/16 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
个人自我评价和职业目标
2014/01/24 职场文书
白鹤梁导游词
2015/02/06 职场文书
清明节寄语2015
2015/03/23 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
python解决12306登录验证码的实现
2021/04/18 Python