热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

上传图片实时预览

引入当使用上传图片文件时,如何在上传到服务器之前,在本地进行预览?FileReader对象FileReade

引入

当使用上传图片文件时,如何在上传到服务器之前,在本地进行预览?

FileReader 对象

FileReader对象允许Web应用程序异步读取用户计算机上的文件。使用new创建一个FileReader实例对象:

let fileReader = new FileReader();

属性

  • error:在读取时发生的错误
  • readyState:fileReader当前状态
  • result:读取到的文件内容,只有在读取操作完成后有效

方法

  • abort():终止读取操作
  • readAsDateURL():读取文件中的内容,读取完成后调用onloadend方法,结果result中包含一个data:URL格式的字符串表示文件内容(针对图片就是base64格式的字符串)

事件处理程序

  • onabort:读取被终止时被调用
  • onerror:读取错误时调用
  • onload:读取成功时调用
  • onloadend:读取完成时调用,无论成功失败, 在onloadonerror后调用
  • onloadstart:读取开始前调用
  • onprogress:读取过程中周期调用、

兼容性

image

使用FileReader对象预览图片

  • onchange事件中获取上传的图片对象
  • 使用event.target.files获取上传对象的类数组对象,每一项的name属性对应文件名
  • 中增加multiple属性,上传多个文件
  • 创建FileReader对象,并通过readAsDateURL()方法,传入要预览的文件对象,在onload回调函数中对FileReader对象的result进行处理

代码:

预览多张图片






拖拽预览

不通过点击事件而是通过将图片拖拽到指定区域实现预览。

在拖放过程中会触发的事件:

  • 在源元素上触发的事件(需要设置 draggable 属性)

    • ondragstart:开始拖动时触发
    • ondrag:拖动时触发
    • ondragend:拖动完成时触发
  • 释放时触发的事件

    • ondragenter:进入容器范围时触发
    • ondragover:拖动时触发(触发间隔350毫秒)
    • ondragleave:离开容器范围时触发
    • ondrop:拖动过程中,释放鼠标按键时触发

显然这里需要使用的是 ondrop 事件,但是需要注意,使用ondrop 事件需要阻止浏览器默认行为,否则不会触发

document.addEventListener("drop", function(e) { //释放e.preventDefault();
});
document.addEventListener("dragenter", function(e) { //拖进e.preventDefault();
});
document.addEventListener("dragleave", function(e) { //拖离e.preventDefault();
});
document.addEventListener("dragover", function(e) { //拖来拖去e.preventDefault();
});

然后在 ondrop 事件中触发上面的函数就可以实现图片预览了。注意,`inputonchange 事件获取文件对象是 e.target.files,而 drop 事件则是 e.dataTransfer.files

window.URL.createObjectURL()

也可以通过这个方法来实现图片的预览

URL.createObjectURL() 静态方法会创建一个 DOMString,这个新的URL 对象表示指定的 File 对象或 Blob 对象。

在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。

// 使用 createObjectURL
function preview2(files) {Object.keys(files).forEach(function(file) {img.src = window.URL.createObjectURL(files[file]);})
}

区别

由于 URL.createObjectURL() 是浏览器自身的接口,貌似性能会更好一点

并且可能比fileReader对IE的兼容性好一些,问题少一些?

不过可以二者选择使用吧,多一个选择不是坏事

参考

  • MDN FileReader
  • js图片前端预览之 filereader 和 window.URL.createObjectURL
  • 图片上传预览 (URL.createObjectURL)
  • chrome拖拽不响应ondrop和dataTransfer.setData事件
  • Javascript实现拖拽预览,AJAX小文件上传
  • 菜鸟教程 ondrop 事件



推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • Ihaveaforminadirectivetemplate:我在指令模板中有一个表单:<formn ... [详细]
  • MySQL binlog与增量备份的基本原理总结
    定义binlog是记录所有数据库表结构变更(例如CREATE、ALTERTABLE…)以及表数据修改(INSERT、UPDATE即使up ... [详细]
author-avatar
手机用户2502870493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有