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实现LOADING效果
Mar 16 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
Mar 26 Javascript
jQuery简单操作cookie的插件实例
Jan 13 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
Vue中fragment.js使用方法详解
Mar 09 Javascript
js实现图片懒加载效果
Jul 17 Javascript
微信小程序如何获取用户手机号
Jan 26 Javascript
理解 JavaScript EventEmitter
Mar 29 Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 Javascript
es6函数name属性功能与用法实例分析
Apr 18 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
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
B2K与车机的中波PK
2021/03/02 无线电
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
mysql+php分页类(已测)
2008/03/31 PHP
php mysql索引问题
2008/06/07 PHP
php中的比较运算符详解
2013/10/28 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
Python闭包函数定义与用法分析
2018/07/20 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
秘书专业自荐信范文
2013/12/26 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
个人作风建设总结
2014/10/23 职场文书
营运督导岗位职责
2015/04/10 职场文书
老兵退伍感言
2015/08/03 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js