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中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
Python 中Pickle库的使用详解
Feb 24 Python
python表格存取的方法
Mar 07 Python
python中字符串内置函数的用法总结
Sep 13 Python
python仿evething的文件搜索器实例代码
May 13 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python处理写入数据代码讲解
Oct 22 Python
python中使用np.delete()的实例方法
Feb 01 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
JS的get和set使用示例
2014/02/20 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
Python求导数的方法
2015/05/09 Python
python多进程共享变量
2016/04/06 Python
Python 专题四 文件基础知识
2017/03/20 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Python中常用的os操作汇总
2020/11/05 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
八一演出活动方案
2014/02/03 职场文书
大学新生入学教育方案
2014/05/16 职场文书
企业承诺书怎么写
2014/05/24 职场文书
学雷锋标语
2014/06/25 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
烟台的海导游词
2015/02/02 职场文书
社区活动总结
2015/02/04 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL