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 相关文章推荐
JS Array对象入门分析
Oct 30 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 Javascript
jquery的each方法使用示例分享
Mar 25 Javascript
js焦点文字滚动效果代码分享
Aug 25 Javascript
js实现可控制左右方向的无缝滚动效果
May 29 Javascript
js实现倒计时及时间对象
Nov 15 Javascript
原生js实现验证码功能
Mar 16 Javascript
通过js修改input、select默认字体颜色
Apr 19 Javascript
把vue-router和express项目部署到服务器的方法
Feb 21 Javascript
详解Angular操作cookies方法
Jun 01 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 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
浅谈PHP变量作用域以及地址引用问题
2013/12/27 PHP
php for 循环使用的简单实例
2016/06/02 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
python中import reload __import__的区别详解
2017/10/16 Python
python opencv之SURF算法示例
2018/02/24 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
浅析Python 责任链设计模式
2020/09/11 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
啤酒销售实习自我鉴定
2013/09/24 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
大学生求职信怎么写
2015/03/19 职场文书
2015年幼师工作总结
2015/04/28 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang