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.validate分组验证代码
Mar 17 Javascript
模拟select的代码
Oct 19 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
Dec 10 Javascript
js中的cookie的读写操作示例详解
Apr 17 Javascript
jQuery实现Twitter的自动文字补齐特效
Nov 28 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
详解vue项目构建与实战
Jun 27 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
小程序清理本地缓存的方法
Aug 17 Javascript
通过说明与示例了解js五种设计模式
Jun 17 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 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模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Convert Seconds To Hours
2007/06/16 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python清除字符串里非数字字符的方法
2015/07/02 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python中url标签使用知识点总结
2020/01/16 Python
python绘制动态曲线教程
2020/02/24 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
审计主管岗位职责
2014/01/31 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
python简单验证码识别的实现过程
2021/06/20 Python
go goroutine 怎样进行错误处理
2021/07/16 Golang