JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析


Posted in Javascript onFebruary 12, 2020

本文实例讲述了JS+HTML实现自定义上传图片按钮并显示图片功能的方法。分享给大家供大家参考,具体如下:

在web开发中,上传文件功能通过type为file的input标签即可实现。但input的显示效果仅为一个按钮,且不能修改UI。如果要实现自定义上传按钮,一般需要设置input为不可见,然后将input与自定义界面放在同一个div中,并将input铺在界面上方:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>图片上传</title>
</head>
<body>
  <!-- 要将父布局的position设置为relative,父布局将无法包裹input -->
  <div style="position: relative;">
    <!--设置input的position为absolute,使其不按文档流排版,并设置其包裹整个布局 -->
    <!-- 设置opactity为0,使input变透明 -->
    <!-- 只接受jpg,gif和png格式 -->
    <input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" accept="image/gif, image/jpg, image/png" />
    <!-- 自定义按钮效果 -->
    <div style="text-align: top">
      <span style="font-size: 12px;">上传文件:</span>
      <img id="upload" src="./upload.png" style="width: 40px; height: 40px; vertical-align: middle;" />
    </div>
  </div>
</body>
</html>

效果如下:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
图片上传

这样,自定义按钮效果就完成了。但是,这样还不能把图片显示出来。要实现显示上传图片功能,可以通过以下方法实现:

  1. FileReader将文件转Base64显示。FileReader能够异步读取文件,并将文件转化为可读取的编码。我们可以通过input获取上传图片的file实例。我们可以通过FileReader将file实例转化为Base64,然后通过img标签加载图片的Base64编码。
<script type="text/javascript">
  function showImg(input) {
    var file = input.files[0];
    var reader = new FileReader()
    // 图片读取成功回调函数
    reader.onload = function(e) {
      document.getElementById('upload').src=e.target.result
    }
    reader.readAsDataURL(file)
  }
</script>
  1. 通过window.URL.createObjectURL创建url。通过该方法可以为file实例创建一个临时的url,img可以通过该url将图片加载出来。由于是临时的url,因此同一个file实例,每次创建的url都会不一样:
function showImg(input) {
    var file = input.files[0];
    var url = window.URL.createObjectURL(file)
    document.getElemtById('upload').src=url
  }

使用上述方法中的其中一种,并将showImg方法挂在input的onchange属性上,就能够显示图片了:

<input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" 
type="file" accept="image/gif, image/jpg, image/png" 
onchange="showImg(this)"/>

显示效果如下:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
显示上传的图片

上述代码中,点击input标签时,一次性只能选择一张图片,如果要选择多张图片,则要给input添加multiple属性:

<input id="upload-input" 
style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" 
accept="image/gif, image/jpg, image/png" multiple onchange="showImg(this)"/>

然后通过多个img显示files里面的图片即可,代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>图片上传</title>
</head>
<body>
  <!-- 要将父布局的position设置为relative,父布局将无法包裹input -->
  <div style="position: relative;">
    <!--设置input的position为absolute,使其不按文档流排版,并设置其包裹整个布局 -->
    <!-- 设置opactity为0,使input变透明 -->
    <!-- 只接受jpg,gif和png格式 -->
    <input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" accept="image/gif, image/jpg, image/png" onchange="showImg(this)" multiple />
    <!-- 自定义按钮效果 -->
    <div style="text-align: top">
      <span style="font-size: 12px;">上传文件:</span>
      <img id="upload" src="./upload.png" style="width: 40px; height: 40px; vertical-align: middle;" />
    </div>
  </div>
  <div id="imgContainer" style="margin-top: 10px;"></div>
</body>
<script type="text/javascript">
  function showImg(obj) {
    var files = obj.files
    // document.getElementById("imgContainer").innerHTML = getImgsByUrl(files)
    getImgsByFileReader(document.getElementById("imgContainer"), files)
  }
  // 使用window.URL.createObjectURL(file)读取file实例并显示图片
  function getImgsByUrl(files) {
    var elements = ''
    for (var i = 0; i < files.length; i++) {
      var url = window.URL.createObjectURL(files[i])
      elements += "<img src='"+ url + "' style='width: 40px; height: 40px; vertical-align: middle; margin-right: 5px;' />"
    }
    return elements
  }
  // 使用FileReader读取file实例并显示图片
  function getImgsByFileReader(el, files) {
    for (var i = 0; i < files.length; i++) {
      let img = document.createElement('img')
      img.setAttribute('style', 'width: 40px; height: 40px; vertical-align: middle; margin-right: 5px;')
      el.appendChild(img)
      var reader = new FileReader()
      reader.onload = function(e) {
        img.src = e.target.result
      }
      reader.readAsDataURL(files[i])
    }
  }
</script>
</html>

最终显示效果如图:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
多图上传

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
幻宇的层模拟窗口效果-提供演示和下载
Jan 20 Javascript
JavaScript 解析Json字符串的性能比较分析代码
Dec 16 Javascript
判断iframe是否加载完成的完美方法
Jan 07 Javascript
JavaScript 以对象为索引的关联数组
May 19 Javascript
jQuery文字横向滚动效果的实现代码
May 31 Javascript
AngularJS服务service用法总结
Dec 13 Javascript
详解js前端代码异常监控
Jan 11 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
vue组件实现进度条效果
Jun 06 Javascript
JQuery事件委托原理与用法实例分析
May 13 jQuery
JavaScript函数IIFE使用详解
Oct 21 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 #Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 #Javascript
使用webpack搭建pixi.js开发环境
Feb 12 #Javascript
十分钟教你上手ES2020新特性
Feb 12 #Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
Feb 12 #Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 #Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 #Javascript
You might like
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python抖音表白程序源代码
2019/04/07 Python
NumPy 数组使用大全
2019/04/25 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
Java如何支持I18N?
2016/10/31 面试题
送货司机岗位职责
2013/12/11 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
领导证婚人证婚词
2014/01/13 职场文书
教师节促销活动方案
2014/02/14 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电