JS实现上传图片的三种方法并实现预览图片功能


Posted in Javascript onJuly 14, 2017

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

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

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

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

1. 模板文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div style="margin-left: 30px; margin-top: 30px">
    <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" style="width: 400px"> {# 实际应用中要将该input标签隐藏,display:none; #}
      <p><input type="submit" value="注册"></p>
      </form>
    <div style="position: absolute; top: 85px; left: 300px;">
    <input id="avatarSlect" type="file" style="position: absolute;float: left; z-index: 10; opacity: 0;width: 100px; height: 100px;">
    <img id="avatarPreview" src="/static/images/sample.png" title="点击更换图片" style="position: absolute; z-index: 9; float: left; width: 100px; height: 100px">
      </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);
{#           $("#avatarPreview").load(function () {#}    /*当图片加载后释放内存空间,但在jQuery3.2.1中会报错。浏览器关闭后也会自动释放*/
{#               window.URL.revokeObjectURL(wuc);#}
{#      })#}
   })
 }
</script>
</html>

2. 视图函数

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. 路由系统

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), # 测试页面
]

验证效果:

选择图片前:

JS实现上传图片的三种方法并实现预览图片功能

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

JS实现上传图片的三种方法并实现预览图片功能

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

JS实现上传图片的三种方法并实现预览图片功能

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

JS实现上传图片的三种方法并实现预览图片功能

以上所述是小编给大家介绍的JS实现上传图片的三种方法并实现预览图片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery 双色表格实现代码
Dec 08 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
Apr 14 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
Oct 14 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
Dec 14 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
AngularJS上传文件的示例代码
Nov 10 Javascript
three.js实现炫酷的全景3D重力感应
Dec 30 Javascript
详解JQuery基础动画操作
Apr 12 jQuery
js+audio实现音乐播放器
Sep 13 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 #Javascript
Javascript中Promise的四种常用方法总结
Jul 14 #Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 #Javascript
详解VUE中v-bind的基本用法
Jul 13 #Javascript
vue通过watch对input做字数限定的方法
Jul 13 #Javascript
深入理解vue $refs的基本用法
Jul 13 #Javascript
js自定义弹框插件的封装
Aug 24 #Javascript
You might like
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
一套软件开发工程师笔试题
2015/05/18 面试题
常见的软件开发流程有哪些
2015/11/14 面试题
环境建设实施方案
2014/03/14 职场文书
出租房屋协议书
2014/09/14 职场文书
高中社区服务活动报告
2015/02/05 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL