纯js图片上传插件

目录标题

    • 一、效果预览
    • 二、使用简单
    • 三、完整代码
    • (一)index.html
    • (二)css
    • (三)js
    • 四、附带后台上传文件代码

一、效果预览

支持多图片上传,删除、预览。
在这里插入图片描述

二、使用简单

  1. 导入依赖(需要依赖jquery)
<link th:href="@{/css/index.css}" rel="stylesheet"/><!--三方依赖-->
<script th:src="@{/js/jquery.min.js}"></script>
<!--<script src="https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script>--><script th:src="@{/js/index.js}"></script>
  1. 绑定图片容器
<div id="img1" style="width: 205px"></div>
const img1 = new imgFactory('img1', [], [], []);
  1. 初始化容器
 img1.init()
  1. 上传图片
//上传图片
var data={url:'/common/uploads',//上传接口文件参数名fileParamName:'files'}img1.upload(data,"img1",function (res) {if (res.isSuccess){}})

三、完整代码

(一)index.html

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>上传图片(拍照上传、图库上传)</title><link th:href="@{/css/index.css}" rel="stylesheet"/>
</head>
<body style="background-color: #F2F2F2"><div><div id="img1" style="width: 205px"></div><div id="img2"></div>
</div>
<div><button type="button" id="upload">上传</button>
</div>
<!--三方依赖-->
<script th:src="@{/js/jquery.min.js}"></script>
<!--<script src="https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script>-->
<script th:src="@{/js/index.js}"></script>
<script>//初始化图片容器const img1 = new imgFactory('img1', [], [], []);img1.init()const img2 = new imgFactory('img2', [], [], []);img2.init()$('#upload').click(function () {//上传图片var data={url:'/common/uploads',//上传接口文件参数名fileParamName:'files'}img1.upload(data,"img1",function (res) {if (res.isSuccess){console.log(res.res)img2.upload(data,"img2",function (res) {if (res.isSuccess){console.log(res.res)}})}})})
</script>
</body>
</html>

(二)css

ul {list-style-type: none; /* 移除项目标记 */padding: 0; /* 移除内边距 */margin: 0; /* 移除外边距 */
}
.upload-content {font-size: 12px;color: #666;padding: 20px;background: #fff;margin-bottom: 15px ;text-align: left;
}.upload-content .content-img-list {display: inline;
}.upload-content .content-img .ico-plus {display: inline-block;vertical-align: middle;margin-top: -4px;margin-left: 2px;width: 28px;height: 28px;
}.upload-content .content-img-list-item {position: relative;display: inline-block;width: 165px;height: 96px;margin-top: 20px;
}
.upload-content .content-img-list-item .hide {display: none;
}.upload-content .content-img-list-item .delete-btn {position: absolute;left: 0;bottom: 0;text-align: center;width: 100%;background: rgba(0, 0, 0, 0.6);height: 28px;line-height: 28px;color: #fff;cursor: pointer;
}.upload-content .content-img-list-item .ico-delete {display: inline-block;vertical-align: middle;width: 12px;height: 13px;
}.upload-content .content-img-list-item img {width: 165px;height: 96px;
}.upload-content .upload-tips {padding-top: 10px;text-align: right;width: 100%;
}/*图片上传按钮*/
.upload-content .file {position: relative;/*display: inline-block;*/border: 1px dashed #DEDEDE;border-radius: 4px;color: #999999;text-decoration: none;text-indent: 0;width: 165px;height: 96px;line-height: 96px;text-align: center;
}.upload-content .file input {position: absolute;font-size: 0px;right: 0;top: 0;opacity: 0;cursor: pointer;width: 165px;height: 96px;
}.upload-content .file:hover {color: #999999;
}.upload-submit {text-align: center;margin-top: 50px;
}.upload-submit .btn-submit-upload {display: inline-block;width: 170px;height: 40px;text-align: center;line-height: 38px;font-size: 14px;box-sizing: border-box;background: #ff8819;color: #fff;border: 1px solid #ff8819;border-radius: 2px;text-decoration: none;
}

(三)js

$(function () {// 鼠标经过显示删除按钮$('.content-img-list').on('mouseover', '.content-img-list-item', function () {$(this).children('a').removeClass('hide');});// 鼠标离开隐藏删除按钮$('.content-img-list').on('mouseleave', '.content-img-list-item', function () {$(this).children('a').addClass('hide');});
});
class imgFactory {/*** * @param elem 容器id* @param imgFile 文件,从input中获取 (数组)* @param imgSrc 用于预览图片的可访问的本地url (数组)* @param imgName 图片名 (数组)*/constructor(elem, imgFile, imgSrc, imgName) {this.elem = elem;this.imgFile = imgFile;this.imgSrc = imgSrc;this.imgName = imgName;}init() {//绑定图片上传var that = this;var imgBox = 'content-img-list-' + that.elem;var upload = this.elem + "-upload";//创建img插件// 创建一个带有类名的 p 元素var newParagraph = '<div class="upload-content">\n' +'    <div class="content-img">\n' +'        <div class="file">\n' +'           <span class="mui-icon mui-icon-plusempty" style="font-size: 16px"></span>上传图片,支持jpg/png<input type="file" multiple name="file" accept="image/*" id="' + upload + '" >\n' +'        </div>\n' +'        <ul class="content-img-list" id="' + imgBox + '">\n' +'        </ul>\n' +'    </div>\n' +'</div>';// 将这个 p 元素添加到文档中的某个特定元素之后$('#' + that.elem).html(newParagraph);$('#' + upload).on('change', function () {// if(imgSrc.length>=4){// 	return alert("最多只能上传4张图片");// }var imgSize = this.files[0].size;  //b// if(imgSize>1024*1024*10){//1M// 	return alert("上传图片不能超过1M");// }// console.log(this.files[0].type)// if(this.files[0].type != 'image/png' && this.files[0].type != 'image/jpeg' && this.files[0].type != 'image/gif'){// 	return alert("图片上传格式不正确");// }var fileList = this.files;for (var i = 0; i < fileList.length; i++) {var imgSrcI = that.getObjectURL(fileList[i]);that.imgName.push(fileList[i].name);that.imgSrc.push(imgSrcI);that.imgFile.push(fileList[i]);}// if(imgSrc.length==10){//隐藏上传按钮// 	$('.content-img .file').hide();// }that.addNewContent(imgBox, that);this.value = null;//解决无法上传相同图片的问题})// 单个图片删除$(".content-img-list").on("click", '.content-img-list-item a', function () {var index = $(this).attr("index");that.imgSrc.splice(index, 1);that.imgFile.splice(index, 1);that.imgName.splice(index, 1);that.addNewContent(imgBox, that);// if (that.imgSrc.length < 4) {//显示上传按钮// 	$('.content-img .file').show();// }});}//建立一个可存取到改file的urlgetObjectURL(file) {var url = null;if (window.createObjectURL != undefined) { // basicurl = window.createObjectURL(file);} else if (window.URL != undefined) { // mozilla(firefox)url = window.URL.createObjectURL(file);} else if (window.webkitURL != undefined) { // webkit or chromeurl = window.webkitURL.createObjectURL(file);}return url;}addNewContent(obj, that) {// console.log(that.imgSrc)// console.log(obj)$("#" + obj).html("");for (var a = 0; a < that.imgSrc.length; a++) {var oldBox = $("#" + obj).html();// console.log(oldBox)$("#" + obj).html(oldBox + '<li class="content-img-list-item"><img src="' + that.imgSrc[a] + '" alt="" data-preview-src="" data-preview-group="'+obj+'"><a index="' + a + '" class="hide delete-btn"><i class="mui-icon mui-icon-trash">删除图标</i></a></li>');}}/*** @param request 上传接口配置* @param msg 提示信息* @param callback 上传后回调函数 -> 实例* function (data) {*    if (data.isSuccess){*        //上传成功,获取上传结果data.res*        console.log(data.res)*    }* }**/upload(request,msg,callback){var formFile = new FormData();if (this.imgFile.length===0){var data={}data.isSuccess = true data.msg = "上传成功,没有选择图片"data.res = {};callback(data)}// 遍历图片imgFile添加到formFile里面$.each(this.imgFile, function (i, file) {formFile.append(request.fileParamName, file);});$.ajax({url: request.url,type: 'POST',data: formFile,//异步上传,通过回调函数获取上传结果async: true,cache: false,contentType: false,processData: false,dataType: 'json',success: function (res) {if (res.code === 0) {//alert("上传成功")console.log(msg+',上传成功!');var data={}data.isSuccess = truedata.msg = "上传成功"data.res = res;callback(data)} else {console.log(msg+',上传失败!');var data={}data.isSuccess = falsedata.msg = "上传失败"data.res = res;callback(data)}}})}
}

四、附带后台上传文件代码

spring boot 项目,新增图片全屏预览

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dart基础语法

Hello Dart Dart 语言与其他许多编程语言一样&#xff0c;以 main 函数作为程序的入口点。以下是一个简单的 "Hello Dart" 程序示例&#xff0c;展示了 Dart 语言的这一特点。 // 标准写法 void main(){print("Hello Dart"); }// 省略写法 main(){print(&…

WebGL绘制和变换三角形

1、绘制多个点 构建三维模型的基本单位是三角形。不管三维模型的形状多么复杂&#xff0c;其基本组成部分都是三角形&#xff0c;只不过复杂的模型由更多的三角形构成而已。 gl.vertexAttrib3f()一次只能向顶点着色器传入一个顶点&#xff0c;而绘制三角形、矩形和立方体等&am…

【网络安全】HTTP协议 — 特点

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、请求与响应 1.服务器和客户端 二、不保存状态 1.不保存状态的协议 三、资源定位 1.URI&#xff08;统一资源标识符&#xff09; 四、请求方法 1.请求方法 五…

如何在window系统中安装Mysql

先简单来说说MySQL是什么&#xff1f; MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 MySQL 由瑞典 MySQL AB 公司开发&#xff0c;目前属于…

多模态模型训练QA

Q&#xff1a;InternLM-XComposer的最新版本把vit的参数量降低了但是效果好了&#xff0c;所以好奇scale up vision encoder的收益大么&#xff1f;还是说重点是一个好的llm&#xff1f; A&#xff1a;结论是二者同步扩大才会起作用。我们试下来结论是llm 7b情况下&#xff0c…

利用AI知识库,优化医保系统售后信息管理流程

在医疗行业中&#xff0c;传统知识库管理虽能整合医疗行业知识&#xff0c;但搜索和管理效率有限&#xff0c;导致医护人员难以高效利用。特别是面对医保系统等复杂系统时&#xff0c;他们常需依赖人工客服或繁琐的电子产品手册解决问题。而HelpLook AI知识库利用AI技术&#x…

中国人民解放军信息支援部队成立

中国人民解放军信息支援部队成立 ----------强化信息化战争能力&#xff0c;维护国家安全 阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或…

基于 Win32 编程,使用 C语言开发一个记事本。

现在 Win32 非常少见&#xff0c;因为太原始了&#xff0c;同时也因为高级语言做应用开发速度更快。但是用 C 语言开发一个 win32 记事本对于理解应用程序运行的内部原理还是很有帮助的&#xff0c;“最基础的就是最有用的”&#xff0c;Windows 编程圣经 《Windows 程序设计》…

HCIP学习笔记

个人学习hcip笔记 供参考 笔记有些乱 之后还会修改完善并添加其他篇幅 OSPF篇 OSPF采用组播方式发送hello包&#xff0c;组播地址为224.0.0.5 相关&#xff1a; 所有节点&#xff1a;224.0.0.1&#xff1b; 所有路由器&#xff1a;224.0.0.2&#xff1b; OSPF DRO发给DR&…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

裸金属服务器和物理机有什么区别

今天&#xff0c;在我们生活的世界中&#xff0c;技术已经彻底改变了我们的生活。在开展在线业务时&#xff0c;服务器在快速高效地执行多项任务方面发挥了极其重要的作用。然而&#xff0c;很多人仍然对裡金属服务器和物理机感到很困惑。今天就给大家分析一下裡金属服务器和物…

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历&#xff0c;也称广度优先搜索&#xff0c; BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 像这种较为…

利用技术优化医保购药体验:开发医保购药APP

为了解决线下医保买药繁琐的流程&#xff0c;利用技术优化医保购药体验成为了当务之急。因此&#xff0c;今天小编将为大家详解如何开发一款医保购药APP。 一、背景与意义 购药流程繁琐、耗时、信息不透明等问题日益凸显&#xff0c;亟需一种新的解决方案。开发医保购药APP可以…

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容&#xff1a;类的六个默认成员函数中…

全网人气排行第一的免费开源ERP:Odoo电商功能应用亮点介绍

Odoo E-Commerce是一款创新型电子商务管理系统&#xff0c;旨在帮助企业建立以客户为中心的B2B与B2C电子商务平台&#xff0c;提高电商业务敏捷性&#xff0c;保障利润&#xff0c;并确保客户体验战略与时俱进。 —— 开源智造Odoo老杨 什么是Odoo免费开源电商管理系统&#xf…

C++:new与delete

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;new与delete》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :rocket: C内存管理:airplane: 初识new和delete:airplane: new和…

海康智能相机FTP本地存图流程

背景&#xff1a;近期一个新项目需要使用到智能相机&#xff0c;借助智能相机算法直接输出检测结果并将相机图像进行本地化保存和展示。由于申购目标智能相机未到&#xff0c;暂时使用测试智能相机。 目标智能相机型号&#xff1a;海康智能相机MV-SC3050XC 当前测试相机型号…

autodesk系列软件安装错误1603,手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067

一般Autodesk Desktop Licensing Service这个服务没安装或者不正常会导致autodesk系列软件安装错误1603或者其他报错。 手动安装Autodesk Desktop Licensing Service之后&#xff0c;启动服务提示错误1067&#xff0c; 解决方法如下 打开autoremove点击扩展功能&#xff0c;输…

基于CAPL的S19文件解析

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

UDS报文传输的四种帧

ISO14229-1规定了26个诊断服务细节&#xff0c;也就是UDS诊断报文的细节。它只规定了各个服务每个字节的含义&#xff0c;它不关心底层到底是怎么传输的。 ISO15765-2规定了基于CAN总线进行UDS报文传输的细节&#xff08;包括四种帧&#xff09;。是在CAN总线传输的情况下&…