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 相关文章推荐
javascript ready和load事件的区别示例介绍
Aug 30 Javascript
jquery显示隐藏input对象
Jul 21 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
Oct 04 Javascript
js实现表单多按钮提交action的处理方法
Oct 24 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
May 20 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
JS实现根据详细地址获取经纬度功能示例
Apr 16 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
Sep 10 Javascript
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
vue在响应头response中获取自定义headers操作
Jul 24 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
destoon二次开发入门示例
2014/06/20 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
Python初学者常见错误详解
2019/07/02 Python
简单了解python PEP的一些知识
2019/07/13 Python
基于python实现学生信息管理系统
2019/11/22 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
Python读取yaml文件的详细教程
2020/07/21 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
测试工程师职业规划书
2014/02/06 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
新春文艺演出主持词
2014/03/27 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
会计演讲稿范文
2014/05/23 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript