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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
python打开使用的方法
Sep 30 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
Python之Class&amp;Object用法详解
Dec 25 Python
python基于property()函数定义属性
Jan 22 Python
pycharm 中mark directory as exclude的用法详解
Feb 14 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 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实现事件监听与触发的方法
2014/11/21 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
PHP asXML()函数讲解
2019/02/03 PHP
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
jQuery事件用法详解
2016/10/06 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
春节活动策划方案
2014/01/24 职场文书
通信工程求职信
2014/07/16 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
工作经验交流材料
2014/12/30 职场文书
月考总结与反思
2015/10/22 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript