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应该是指向硬盘中的视频而不用加载到内存
相关文章:
FileReader与URL.createObjectURL实现图片、视频上传预览
之前做图片、视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览。实际上这只是文件“上传后再预览”,这既浪费了用户的时间,也…...
基于python+Django+SVM算法模型的文本情感识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介1. 简介2. 技术栈3. 系统架构4. 关键模块介绍5. 如何运行 二、功能三、系统四. 总结 一项目简介 # 基于 Python Django SVM 算法模型的文本情感识别系统介…...
数据结构之栈与队列习题详解解析
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.概念题…...
C++ 动态规划 DP教程 (一)思考过程(*/ω\*)
动态规划是一种思维方法,大家首先要做的就是接受这种思维方法,认同他,然后再去运用它解决新问题。 动态规划是用递推的思路去解决问题。 首先确定问题做一件什么事情? 对这件事情分步完成,分成很多步。 如果我们把整件…...
【python基础(九)】文件和异常详解:使用、读取、写入、追加、保存用户的信息,以及优雅的处理异常
文章目录 一. 从文件中读取数据1. 读取整个文件2. 文件路径3. 逐行读取4. 创建一个包含文件各行内容的列表 二. 写入文件1. 写入空文件2. 写入多行3. 附加到文件 三. 异常1. 处理ZeroDivisionError异常2. 使用try-except代码块3. try-except-else ing4. 处理FileNotFoundError异…...
详解C语言中的指针数组和数组指针
指针数组和数组指针是 C 语言中比较常见的两种类型。它们虽然名字很相似,但是含义、用法以及指向类型都不同,需要分开理解。 指针数组 指针数组是一个数组,其中每个元素都是一个指针。这些指针可以指向不同类型的数据,也可以指向…...
【done】剑指offer18:删除链表指定节点
力扣,https://leetcode.cn/problems/shan-chu-lian-biao-de-jie-dian-lcof/description/ // 自己写的答案 class Solution {public ListNode deleteNode(ListNode head, int val) {if (head null) {return null;}if (head.val val) {return head.next;}ListNode …...
图形编辑器开发:缩放和旋转控制点
大家好,我是前端西瓜哥。好久没写图形编辑器开发的文章了。 今天来讲讲控制点。它是图形编辑器的不可缺少的基础功能。 控制点是吸附在图形上的一些小矩形和圆形点击区域,在控制点上拖拽鼠标,能够实时对被选中进行属性的更新。 比如使用旋…...
【2023 云栖】阿里云田奇铣:大模型驱动 DataWorks 数据开发治理平台智能化升级
云布道师 本文根据 2023 云栖大会演讲实录整理而成,演讲信息如下: 演讲人:田奇铣 | 阿里云 DataWorks 产品负责人 演讲主题:大模型驱动 DataWorks 数据开发治理平台智能化升级 随着大模型掀起 AI 技术革新浪潮,大数…...
Rust语言入门教程(二) - 变量与作用域
变量与作用域 变量的声明与初始化 Rust的基本语法格式如下: fn main(){let bunnies 2; }语句以分号结尾,用花括号包含语句块。 Rust的语法其实借鉴了很多其他的语言,比如C语言和Python, 所以变量定义的格式看起来也跟很多我们…...
芯知识 | Flash可更换声音语音芯片—引领音频IC技术革新的新篇章
随着科技的飞速发展,人们对于电子产品的音频性能要求越来越高。在这种背景下,Flash可更换声音语音芯片应运而生,成为音频技术领域的一颗璀璨明星。本文将详细介绍Flash可更换声音语音芯片的特点、优势以及应用场景,展望其在未来科…...
合共软件创新亮相:第102届上海电子展成就技术新篇章
2023年,第102届中国(上海)电子展活动在全球瞩目中圆满落幕。作为下半年华东地区最具影响力的电子展会,此次盛会吸引了来自全球的600家领先企业,共同探讨电子元器件行业的最新发展成果和趋势。 本届展会围绕核心先导元器…...
Ubuntu20.04清理垃圾vscode缓存
使用VM虚拟机安装了Ubuntu系统,主目录空间越来越小,硬盘扩容之后很快又空间不足,甚至出现了开机卡黑屏的情况,这里记录一下解决过程。 1 重新开机进入系统 状态:卡到了开机黑屏状态,左上角有一条小横杠 原…...
网络数据结构skb_buff原理
skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_…...
SpringCache使用详解
SpringCache 1.新建测试项目SpringCache2.SpringCache整合redis2.1.Cacheable2.2.CacheEvict2.3.Cacheput2.4.Caching2.5.CacheConfig 3.SpringCache问题4.SpringCache实现多级缓存 1.新建测试项目SpringCache 引入依赖 <dependencies><dependency><groupId&g…...
windows版本的grafana如何离线安装插件
本文以安装clickhouse的插件为例,记录下如何离线安装插件 1 下载插件 ClickHouse plugin for Grafana | Grafana Labs 2 找到grafana的配置文件 打开编辑,搜索plugin关键字,修改plugin的加载目录 目录不存在,手动创建࿰…...
ElasticSearch01
ElasticSearch 版本:7.8 学习视频:尚硅谷 笔记:https://zgtsky.top/ ElasticSearch介绍 Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;…...
GPT、GPT-2、GPT-3论文精读笔记
视频:GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文:把bert用回计算机视觉领域 CLIP论文:打通文本和图像 GPT 论文:Improving Language Understanding by Generative Pre-Training …...
深度学习八股文:混合精度训练过程出nan怎么办
其实如果是FP32的训练,基本的调试方法还是差不多,这里就讲一下混合精度训练过程中的nan。 混合精度训练使用较低的数值精度(通常是半精度浮点数,例如FP16)来加速模型训练,但在一些情况下,可能会…...
竞赛选题 题目:基于卷积神经网络的手写字符识别 - 深度学习
文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…...
读写锁怎么用?操作系统中Reader Writer Locks实现与应用?
操作系统中的读写者问题是关于管理对共享数据的访问。它允许多个 reader 同时访问数据,但确保同一时间只有一个 writer 可以写入,且在写入过程中不允许任何 reader 读取。 这种方法有助于解决并发编程中的基本问题:为共享资源提供安全的访问…...
AcousticSense AI完整教程:搭建个人音乐分析平台
AcousticSense AI完整教程:搭建个人音乐分析平台 1. 项目介绍与核心价值 AcousticSense AI是一个将音乐"可视化"的智能分析平台,它能够像人类一样"看"音乐并识别风格。这个工具最吸引人的地方在于,它用了一种非常聪明的…...
Cosmos-Reason1-7B详细步骤:从/root/cosmos-reason-webui目录开始的定制化配置
Cosmos-Reason1-7B详细步骤:从/root/cosmos-reason-webui目录开始的定制化配置 1. 项目概述 Cosmos-Reason1-7B是NVIDIA开源的一款7B参数量的多模态物理推理视觉语言模型(VLM),作为Cosmos世界基础模型平台的核心组件,专注于物理理解与思维链…...
Calibre中文路径保护插件:终极解决方案告别拼音路径困扰
Calibre中文路径保护插件:终极解决方案告别拼音路径困扰 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 项目地址:…...
AI热修复不是幻想,而是已上线:某头部云厂商实测数据——平均MTTR从18分钟降至2.3秒,
第一章:2026奇点智能技术大会:AI代码热修复 2026奇点智能技术大会(https://ml-summit.org) 什么是AI代码热修复 AI代码热修复(AI-Powered Hotfix)指在不中断服务运行的前提下,由AI模型实时分析生产环境中的异常堆栈、…...
OpenAI发布GPT-5.4-Cyber:网络安全AI新利器
OpenAI周二正式发布了GPT-5.4-Cyber,这是其最新旗舰模型GPT-5.4的专属优化版本,针对网络安全防御场景进行了深度定制优化。此次发布正值竞争对手Anthropic推出前沿模型Mythos数日之后,再次点燃了AI安全领域的激烈竞争。 OpenAI Touts Wider A…...
5个实战技巧:用ChatGPT写编程提示词避坑指南(附Python示例)
5个实战技巧:用ChatGPT写编程提示词避坑指南(附Python示例) 在AI辅助编程的时代,编写有效的提示词(Prompt)已成为开发者必备的核心技能。本指南将聚焦Python开发场景,通过5个经过实战检验的技巧…...
芯片ESD防护设计避坑指南:从失效案例看如何优化你的电路
芯片ESD防护设计避坑指南:从失效案例看如何优化你的电路 静电放电(ESD)是芯片设计中最隐蔽的"隐形杀手"。据统计,超过60%的芯片早期失效与ESD事件相关,但大多数损伤在显微镜下才能被发现。我曾参与过一个智能…...
WSL2网络互通新思路:不折腾IP,用域名访问Win和Linux服务(附Python测试方法)
WSL2网络互通新思路:用域名优雅连接Windows与Linux服务 每次重启WSL2都要重新查找IP地址的日子该结束了。想象一下这样的场景:你在Windows上调试前端代码,需要频繁访问运行在WSL2中的API服务;或者反过来,在Linux环境下…...
Casely 再召回超 42.9 万个移动电源,新增事故致 1 人死亡
Casely 移动电源二次召回:事故再升级2025 年 4 月,Casely 首次召回超 42.9 万个 5000mAh 的 Power Pods 无线移动电源,原因是收到 51 起有关锂离子电池“过热、膨胀或起火”的报告,导致 6 人轻微烧伤。如今,该公司和美…...
