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

拖拽上传(预览图片)

需求

点击+上传图片,或直接拖拽图片到红色方框里面也可上传图片,上传后预览图片

效果

在这里插入图片描述

实现

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图片文件拖拽上传</title><style>* {margin: 0;padding: 0;}img {display: block;width: 200px;height: auto;}.show-img {display: flex;justify-content: center;align-items: center;width: 800px;height: 320px;margin: 100px auto;border: 1px solid red;}.container {display: flex;}.upload {position: relative;width: 100px;height: 100px;border: 2px dashed #ccc;}.upload::before,.upload::after {content: '';position: absolute;left: 0;top: 0;bottom: 0;right: 0;margin: auto;background-color: black;}.upload::before {width: 20px;height: 4px;}.upload::after {width: 4px;height: 20px;}/* 触发file类型的Input上传文件不一定要点击上传按钮,点在Input身上即可 */#file-input {opacity: 0;box-sizing: border-box;width: 100px;height: 100px;}.preview {position: relative;width: 100px;height: 100px;margin: 0 20px;border-radius: 5px;}.preview-img {width: 100%;height: 100%;}.delete {position: absolute;width: 10px;height: 10px;top: -5px;right: -5px;color: red;}</style>
</head><body><form class="container" action=""><div class="upload"><input type="file" id="file-input" hidden></div><div class="show-box"></div></form><div class="show-img"></div><script>let input = document.querySelector('input[type="file"]');let showImg = document.querySelector('.show-img');let imgInput = document.querySelector('#file-input');let uploadBox = document.querySelector('.upload');//点击别的位置调用inputFile功能uploadBox.addEventListener('click',function(e){imgInput.click();},false);//拖拽上传showImg.addEventListener('dragover',function(e){e.preventDefault();},false);showImg.addEventListener('drop',function(e){e.preventDefault();let file =  e.dataTransfer.files[0];createBolbFile(file)},false);//点击input上传input.addEventListener('change', function (e) {console.log(input.files[0]);//拿到input当前上传的文件,拿不到url,想在页面展示必须有urllet file = this.files[0];// createFileReader(file);createBolbFile(file)}, false);function createImg(src){let img = document.createElement('img');img.src = src;showImg.append(img);}//生成临时blob存储function createBolbFile(file){let url = URL.createObjectURL(file); //生成一个临时地址blob,不可持续//创建一个url的blob ,在当前会话下生效,不像base64那样在哪里都能用,如在浏览器中用,当你关掉浏览器再开浏览器用则不生效,是一种临时文件createImg(url)}//base64存储function createFileReader(file) {let fileReader = new FileReader();//通过FileReader的result可以拿到文件的urlfileReader.readAsDataURL(file);//把文件创建成url的data对象fileReader.onload = function () { //file加载完成才可以拿到urllet src = this.result  //base64存储createImg(src);}}/* base64存储base64是新的文件协议格式,传输8bit字节码的编码方式,借助64个可以表示字符[A,B,C...1,2,3] 转换二进制 base64 字符串通用性很强 不依赖平台 不依赖环境 可持续 ,可以以字符串的形式传输图片、文档等可以很方便的用来展示图片,下载文档-----------------------------------------------blob存储如果要持续存储用base64,只是临时调用用blobblob网址URL只能在浏览器内部生成 URL/Object 允许Blob 和 file对象用作图像上 二进制数据连接URL源 URL.createObjectURL(file) 生成地址同一个会话中 同一个浏览器实例中可以使用 临时的对象地址 不可持续*/</script>
</body></html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UseMemo、UseCallback、React.memo
  • RK3568笔记三十六:LED驱动开发(设备树)
  • 香橙派AIpro-携手华为-为AI赋能
  • 全时守护,无死角监测:重点海域渔港视频AI智能监管方案
  • Flink History Server配置
  • 【Python进阶】正则表达式、pymysql模块
  • 《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记
  • 【CMU博士论文】结构化推理增强大语言模型(Part 0)
  • 上海理工大学24计算机考研考情分析!初复试分值比55:45,复试逆袭人数不算多!
  • 发布支持TS的npm包
  • 仅两家!云原生向量数据库 PieCloudVector 全项通过信通院「可信数据库」评测
  • 全国媒体邀约,主流媒体到场出席采访报道
  • 20240718每日后端------------kafka VS RabbitMQ:选择正确的消息代理
  • Flutter应用开发:掌握StatefulWidget的实用技巧
  • 字节面试:如何让单机下Netty支持百万长连接?
  • 收藏网友的 源程序下载网
  • Asm.js的简单介绍
  • flask接收请求并推入栈
  • Java|序列化异常StreamCorruptedException的解决方法
  • Map集合、散列表、红黑树介绍
  • mongo索引构建
  • Node 版本管理
  • Python3爬取英雄联盟英雄皮肤大图
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 分享几个不错的工具
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 为视图添加丝滑的水波纹
  • 优化 Vue 项目编译文件大小
  • 原生js练习题---第五课
  • FaaS 的简单实践
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #if #elif #endif
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (笔试题)合法字符串
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net CF下精确的计时器
  • .net core 控制台应用程序读取配置文件app.config
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET6实现破解Modbus poll点表配置文件
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [Android]通过PhoneLookup读取所有电话号码