js实现头像上传并且可预览提交


Posted in Javascript onDecember 25, 2020

在用户注册账号或者修改资料的时候会需要用户在本地选择一张图片作为头像,并同时预览,

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

这两种方法各有利弊,方法一很明显,浪费流量和服务器资源;方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高。

这里介绍的是直接在本地内存中预览图片,用户确认提交后再上传至服务器保存这种方法

html

<div class="reHead">
   <P class="content-format">头像支持jpg、png、jpeg格式,文件大小最大不能超过1M</P>
   <div class="content">
     <form method="post" enctype="multipart/form-data" id="file_upload" class="headForm">
       <div id="test-image-preview" class="iconfont icon-bianjitouxiang">
         <input type="file" name="test" id="test-image-file" class="fileHead" accept="image/gif, image/jpeg, image/png, image/jpg" multiple="multiple">
       </div>
       <div class="headMain">
         <span class="file">上传文件</span>
         <p id="test-file-info" class="fileName"></p>
       </div>
     </form>
   </div>
   <div class="but">
     <button class=" orangeHead" id="upImgSub"><a href="" title=" rel="external nofollow" 编辑资料" target="_blank">保存</a></button>
   </div>
 </div>

js 上传头像

<script type="text/javascript" src="./jquery.min.js"></script>
  <script>
    var fileInput = document.getElementById('test-image-file'),
      info = document.getElementById('test-file-info'),
      preview = document.getElementById('test-image-preview');
      dataBase64 = '',
    // preview.style.backgroundImage = 'url(../../img/portrait.png)';  //默认显示的图片

    // 监听change事件:
    fileInput.addEventListener('change', upImg);

    // 头像上传逻辑函数
    function upImg(){
      preview.style.backgroundImage = '';    // 清除背景图片
      if (!fileInput.value) {   // 检查文件是否选择:
        $('#test-image-preview').addClass('icon-bianjitouxiang');
        info.innerHTML = '没有选择文件';
      }else{
        $('#test-image-preview').removeClass('icon-bianjitouxiang');
        info.innerHTML = '';
      }
      
      var file = fileInput.files[0];  // 获取File引用
      var size = file.size;
      if (size >= 1 * 1024 * 1024) {   //判断文件大小
        info.innerHTML = '文件大于1兆不行!';
        preview.style.backgroundImage = '';
        $('#test-image-preview').addClass('icon-bianjitouxiang');
        return false;
      }
      
      if (file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'image/gif') {  // 获取File信息:
        info.innerHTML = '不是有效的图片文件!';
        preview.style.backgroundImage = '';
        $('#test-image-preview').addClass('icon-bianjitouxiang');
        return;
      }

      // 读取文件:
      var reader = new FileReader();
      reader.onload = function (e) {
        dataBase64 = e.target.result;   // 'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...}'    
        preview.style.backgroundImage = 'url(' + dataBase64 + ') ';
        preview.style.backgroundRepeat = 'no-repeat';
        preview.style.backgroundSize = ' 100% 100%';
      };
      // 以DataURL的形式读取文件:
      reader.readAsDataURL(file);
      // console.log(file);
    }

js 提交头像到服务器

$("#upImgSub").click(function () {
      $.ajax({
        type:'post',
        data:{'newHead':dataBase64},
        async:false,   // 当async属性的值为false时是同步的,Ajax请求将整个浏览器锁死,只有ajax请求返回结果后,才执行ajax后面的alert语句。  (虽然可行,但是不推荐)              // 当async属性的值为true时是异步的,即不会等待ajax请求返回的结果,会直接执行ajax后面的alert语句。    (后期介绍异步请求解决回地狱)
        dataType:'json',
        url:'/index/img',
        success:function (res) {  // 返回成功
          if(res.code === 200){
            alert(msg)     // 上传成功
          }else{
            alert(msg)     // 上传失败
          }
        },
        error:function () {
          alert("接口错误");    // 返回失败
        }
      })
    });

当async属性的值为false时是同步的,Ajax请求将整个浏览器锁死,只有ajax请求返回结果后,才执行ajax后面的alert语句。 (虽然可行,但是不推荐) 当async属性的值为true时是异步的,即不会等待ajax请求返回的结果,会直接执行ajax后面的alert语句。 (后期介绍异步请求解决回地狱)

css

body{
  font-size: 12px;
}
.reHead{
  margin: 15px 4%; 
}
.headForm{
  text-align: center;
  padding: 40px 0 70px 0;
}
#test-image-preview {
  position: relative;
  display: inline-block;
  width: 100px;
  height: 100px;
  border-radius: 50px;
  background: #F5F5F5;
  color: #fff;
  font-size: 60px;
  text-align: center;
  line-height: 100px;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center center;
  margin-bottom: 26px;
}
.fileHead{
  position: absolute;
  width: 100px;
  height: 100px;
  right: 0;
  top: 0;
  opacity: 0;
}
.content-format {
  font-size: 12px;
  font-weight: 400;
  color: rgba(153, 153, 153, 1);
}
.headMain{
  height: 40px;
}
.file {
  position: relative;
  background: #fff;
  color: #F39800;
  font-weight:800;
}
.file input {
  position: absolute;
  font-size: 12px;
  right: 0;
  top: 0;
  opacity: 0;
}
.fileName {
  line-height: 28px;
  font-size: 12px;
  font-weight: 400;
  color: rgba(51, 51, 51, 1);
}
.but{
  text-align: center;
}
.orangeHead{
  width: 40%;
  height: 40px;
  background: #f60;
  border: none;
}
.orangeHead a{
  color: #fff;
}

以上就是js实现头像上传并且可预览提交的详细内容,更多关于js 头像上传的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jquery复选框CHECKBOX全选、反选
Aug 30 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
May 13 Javascript
js获取class的所有元素
Mar 28 Javascript
javascript中encodeURI和decodeURI方法使用介绍
May 06 Javascript
Jquery读取URL参数小例子
Aug 30 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
javascript实现图像循环明暗变化的方法
Feb 25 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
从零开始搭建一个react项目开发
Feb 09 Javascript
如何给element添加一个抽屉组件的方法步骤
Jul 14 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
如何在JavaScript中正确处理变量
Dec 25 #Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 #Vue.js
vue使用require.context实现动态注册路由
Dec 25 #Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 #Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 #Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 #Vue.js
React中使用Vditor自定义图片详解
Dec 25 #Javascript
You might like
php7 安装yar 生成docker镜像
2017/05/09 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
详解Python多线程下的list
2020/07/03 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
一套VC试题
2015/01/23 面试题
气象学专业个人求职信
2014/04/22 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
导游词400字
2015/02/13 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
导游词之凤凰古城
2019/10/22 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
Android Rxjava3 使用场景详解
2022/04/07 Java/Android