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入门教程(9) Document文档对象
Jan 31 Javascript
csdn 批量接受好友邀请
Feb 19 Javascript
非主流的textarea自增长实现js代码
Dec 20 Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 Javascript
浅谈Javascript中substr和substring的区别
Sep 30 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
Aug 07 Javascript
详解node单线程实现高并发原理与node异步I/O
Sep 21 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
vue实现在线翻译功能
Sep 27 Javascript
vue界面发送表情的实现代码
Sep 11 Javascript
小程序实现文字循环滚动动画
Jun 14 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 神盾解密工具 ”
2014/06/20 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
Vue官网todoMVC示例代码
2018/01/29 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
Python实现两款计算器功能示例
2017/12/19 Python
python实现简易云音乐播放器
2018/01/04 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
Python3如何判断三角形的类型
2020/04/12 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
公司活动策划方案
2014/01/13 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
《观潮》教学反思
2016/02/17 职场文书
如何利用python实现列表嵌套字典取值
2022/06/10 Python