当前位置: 首页 > news >正文

FileReader与URL.createObjectURL实现图片、视频上传预览

之前做图片、视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览。实际上这只是文件“上传后再预览”,这既浪费了用户的时间,也浪费了不可轻视的流量。

最近上网查资料才知道其实可以很轻松地实现“上传前预览”。实现方法有两种:FileReader和URL.createObjectURL。

关于FileReader的讲解可以看这里

关于URL.createObjectURL方法的讲解和应用可以看这里

 IE10+

直接上代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>preview</title><style>* {box-sizing: border-box;}.section {margin: 20px auto;width: 500px;border: 1px solid #666;text-align: center;}.preview {width: 100%;margin-top: 10px;padding: 10px;min-height: 100px;background-color: #999;}.preview img,.preview video {width: 100%;}</style><script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js" type="text/javascript"></script>
</head>
<body><div class="section"><p>方案1-FileReader</p><input class="upload" type="file" onchange=onUpload1(this.files[0])><div class="preview preview1"></div></div><div class="section"><p>方案2-createObjectURL</p><input class="upload" type="file" onchange=onUpload2(this.files[0])><div class="preview preview2"></div></div><script>// 方式一:FileReaderfunction onUpload1 (file) {var fr = new FileReader();fr.readAsDataURL(file);  // 将文件读取为Data URLfr.onload = function(e) {var result = e.target.result;if (/image/g.test(file.type)) {var img = $('<img src="' + result + '">');$('.preview1').html('').append(img);} else if (/video/g.test(file.type)) {var vidoe = $('<video controls src="' + result + '">');$('.preview1').html('').append(vidoe);}}}// 方式二:createObjectURL(推荐)function onUpload2 (file) {var blob = new Blob([file]), // 文件转化成二进制文件url = URL.createObjectURL(blob); //转化成url// 或者直接:var url = window.URL.createObjectURL(file);if (/image/g.test(file.type)) {var img = $('<img src="' + url + '">');img[0].onload = function(e) {URL.revokeObjectURL(this.src);  // 释放createObjectURL创建的对象}$('.preview2').html('').append(img);} else if (/video/g.test(file.type)) {var video = $('<video controls src="' + url + '">');$('.preview2').html('').append(video);video[0].onload = function(e) {URL.revokeObjectURL(this.src);  // 释放createObjectURL创建的对象}}}</script>
</body>
</html>

一个视频编码成dataUrl放到内存浏览器肯定崩溃,用createObjectURL生成的url应该是指向硬盘中的视频而不用加载到内存

相关文章:

  • elasticsearch 7安装
  • css中flex两列布局(一列自适应其他固定)
  • 专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析
  • 基于 STM32Cube.AI 的嵌入式人脸识别算法实现
  • Flink-简介与基础
  • docker 部署hbase 并且java Api连接
  • Nginx安装与配置、使用Nginx负载均衡及动静分离、后台服务部署、环境准备、系统拓扑图
  • spark的算子
  • Web3与Web3.0: Web3指的是去中心化和基于区块链的网络,Web3.0指的是链接或语义网络。
  • 讲述 什么是鸿蒙 为什么需要鸿蒙 为什么要学习鸿蒙
  • 网络攻击的常见手段
  • DataFunSummit:2023年现代数据栈技术峰会-核心PPT资料下载
  • Unity开发之C#基础-File文件读取
  • 合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
  • 机器视觉技术在现代汽车制造中的应用
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • ES6 ...操作符
  • express.js的介绍及使用
  • input实现文字超出省略号功能
  • Redis字符串类型内部编码剖析
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vim Clutch | 面向脚踏板编程……
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何在GitHub上创建个人博客
  • 实现简单的正则表达式引擎
  • ​520就是要宠粉,你的心头书我买单
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #Linux(帮助手册)
  • $.each()与$(selector).each()
  • (11)MSP430F5529 定时器B
  • (2022 CVPR) Unbiased Teacher v2
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (学习日记)2024.02.29:UCOSIII第二节
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)ObjectiveC 深浅拷贝学习
  • (转)创业家杂志:UCWEB天使第一步
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .net core 依赖注入的基本用发
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中使用Redis (二)