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 相关文章推荐
js 字符串转化成数字的代码
Jun 29 Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
再谈javascript原型继承
Nov 10 Javascript
javascript去除空格方法小结
May 21 Javascript
jQuery 判断是否包含在数组中Array[]的方法
Aug 03 Javascript
bootstrap监听滚动实现头部跟随滚动
Nov 08 Javascript
iphone刘海屏页面适配方法
May 07 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
vue新建项目并配置标准路由过程解析
Dec 09 Javascript
功能完善的小程序日历组件的实现
Mar 31 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
如何在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
php根据用户语言跳转相应网页
2015/11/04 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
Node.js实现数据推送
2016/04/14 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
微信小程序日历效果
2018/12/29 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python 使用with上下文实现计时功能
2018/03/09 Python
python实现list由于numpy array的转换
2018/04/04 Python
python如何统计代码运行的时长
2019/07/24 Python
Python for i in range ()用法详解
2020/09/18 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
生物科学专业个人求职信范文
2013/12/05 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
护士先进个人总结
2015/02/13 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
拖欠货款起诉状
2015/05/20 职场文书