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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
python中__slots__节约内存的具体做法
Jul 04 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下MYSQL limit的优化
2008/01/10 PHP
php 抽象类的简单应用
2011/09/06 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中shape计算矩阵的方法示例
2017/04/21 Python
python中 logging的使用详解
2017/10/25 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python 实现兔子生兔子示例
2019/11/21 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
C#软件工程师英语面试题
2015/06/07 面试题
大学生学习生活的自我评价
2013/11/01 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2014年保洁工作总结
2014/11/24 职场文书
病人慰问信范文
2015/02/15 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python