纯js图片上传插件

news2024/11/18 8:59:07

目录标题

    • 一、效果预览
    • 二、使用简单
    • 三、完整代码
    • (一)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的url
    getObjectURL(file) {
        var url = null;
        if (window.createObjectURL != undefined) { // basic
            url = window.createObjectURL(file);
        } else if (window.URL != undefined) { // mozilla(firefox)
            url = window.URL.createObjectURL(file);
        } else if (window.webkitURL != undefined) { // webkit or chrome
            url = 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 = true
                    data.msg = "上传成功"
                    data.res = res;
                    callback(data)
                } else {
                    console.log(msg+',上传失败!');
                    var data={}
                    data.isSuccess = false
                    data.msg = "上传失败"
                    data.res = res;
                    callback(data)
                }
            }
        })
    }
}

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

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

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

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

相关文章

视觉化数据的艺术:掌握Matplotlib基础绘图

Matplotlib基础绘图 文章目录 Matplotlib基础绘图1.基础流程2.绘图设置3.动态rc参数4.pyplot的基础图表函数 安利 1.基础流程 1.导入模块。绘图之前&#xff0c;需要先导入包含相应函数的模块。 2.创建画布与创建子图。第一部分主要是构建出一张空白的画布&#xff0c;如果需要…

Elastic 网络爬虫:为你的网站添加搜索功能

作者&#xff1a;来自 Elastic Lionel Palacin 为了演示如何使用 Elastic 网络爬虫&#xff0c;我们将以一个具体的网站为例&#xff0c;讲解如何在该网站上添加搜索功能。我们将探讨发现网站的方法&#xff0c;并利用 Elastic 网络爬虫提供的功能&#xff0c;以最佳方式准备待…

springboot+ssm基于Java的小型企业银行账目管理系统代码Lw

本毕业设计课题要求学生基于软件工程方法&#xff0c;根据课题的需求&#xff0c;给出小型企业银行账目管理系统概要设计、详细设计、数据库的设计以及系统实现和测试&#xff0c;并撰写规范的毕业设计说明书。该系统的主要模块有&#xff1a;系统管理、帐目管理、查询统计、用…

如何创建响应式HTML电子邮件模板

在这个适合初学者的指南中&#xff0c;你将学习如何创建一个响应式电子邮件模板。你将跟随逐步说明以及代码片段设计一个在任何设备上都看起来很棒的电子邮件模板。 这个项目非常适合渴望掌握电子邮件设计基础的新手&#xff01; &#xff08;本文视频讲解&#xff1a;java56…

抖店严查违规店铺!老商家下台,新手正是入驻时机!

哈喽~我是电商月月 抖店一直在严查违规店铺&#xff0c;很多新手都在犹豫不前&#xff0c;不知道要不要去做抖音小店 以为是抖音平台在“想方设法”克扣商家钱财&#xff0c;开店都是坑&#xff1f; 要这样想&#xff0c;那就大错特错了&#xff01; 抖店整改&#xff0c;把…

你的mongodb客户端是哪个呢?

MongoDB 是一种流行的文档数据库&#xff0c;它可以支持多种场景和应用。有很多客户端工具可以用来管理和操作 MongoDB&#xff0c;以下是一些常用的工具&#xff0c;以及它们的介绍&#xff1a; 一、MongoDB Shell MongoDB Shell 是连接&#xff08;和使用&#xff09;MongoD…

每日一题:计数质数

给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3&#…

NVIDIA智算中心“产品”上市,AI工业革命的iPhone时刻

GTC 2024落下帷幕了&#xff0c;但这个大会的信息仍在AI产业和经济中发酵。咨询机构WIKIBON认为&#xff0c;GTC 2024在整个科技史中的意义超过了当年史蒂夫乔布斯的iPod和iPhone发布。在AI将永久改变人类的共识下&#xff0c;GTC 2024在广度、愿景、生态系统等方面都有着深远影…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业&#xff0c;特别是在I/IIC级防爆区场景中&#xff0c;存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如&#xff0c;油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点&#xff0c;都面临着这些潜在的危险。传统的人工…

如何使用ArcGIS Pro进行路径分析

路径分析是一种空间分析技术&#xff0c;用于确定两个或多个地点之间最佳路径或最短路径&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何进行路径分析&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的道路数据&#xff0c;除了道路数据&a…

交换基础配置--单臂路由

1、创建vlan 创建vlan10 创建vlan10和vlan20 创建vlan1到vlan9 vlan1可以不用创建&#xff0c;因为交换机的所有接口默认为vlan1 本实验只需要vlan10和vlan20&#xff0c;以上只是介绍创建vlan的方法。 查看创建的vlan&#xff1a; sw2同理。接着将需要划分vlan的接口划入…

linux基本命令2

一、Whereis是查找工具中速度最快的一个&#xff0c;但是whereis查找的范围有限&#xff0c; whereis只能查找2进制程序&#xff0c; 使用whereis查找 ls -b&#xff1a;查找2进制程序 -m&#xff1a;查找文档 -s&#xff1a;查找码源 二、which命令是查找工具中速度最快命令…

3D模型查看器开发实战【WebGL】

本文介绍如何从头开发一个包含3D 模型查看器的页面 - 尽管它非常简单&#xff0c;但你将学习的步骤也应该有助于构建其他类型的 Web 应用程序。 在自己的网站或博客里展示3D模型更简单的方式是使用NSDT 3DConvert提供的在线服务&#xff0c;无需任何开发工作&#xff0c;5分钟…

access多表关联提示:语法错误(操作符丢失)在查询表达式中

在access数据库中执行多表关联时提示了一个错误 select * from Patient a inner join BioMain b on a.BioIDb.BioID inner join BioResult c on b.BioIDc.BioID where len(a.PatientID)>12 and b.AddTime>#2024-04-17 05:53:23# and b.AddTime<#2024-04-17 17:53:23#…

基于Python 实现数据可视化大屏

数据本身是冰冷的数字&#xff0c;通过选择合适的图形或者图表来进行展示表达&#xff0c;使得传递给使用者的感受更加直观、更容易获得其中的价值。 数据可视化将技术与艺术完美结合&#xff0c;借助图形化的手段&#xff0c;清晰有效地传达与沟通信息。一方面&#xff0c;数…

Unity地形关联出错的解决办法以及地形深度拷贝

问题 最近发现unity地形系统的一个bug&#xff0c;导入的场景地形数据关联错乱了&#xff0c;关联到别的场景的地形数据了&#xff0c;meta替换了也没用&#xff0c;不清楚它具体是怎么关联的。 看下面的案例&#xff1a; 可以看到正常这个场景的地形数据应该关联的是Scene_E…

【GitBlit】Windows搭建Git服务器详细教程

前言 如果公司或个人想在 Windows 环境下搭建私有的 Git 服务器&#xff0c;那么这个开源的 GitBlit 是一个不错的选择。 Gitblit 是一个开源纯 Java 的用于管理、查看和服务 Git 存储库。它是一个小型的托管集中式存储库工具。支持 SSH、HTTP 和 GIT 协议&#xff0c;开箱即…

SpringBoot项目如何实现邮件发送

文章目录 1. 开启邮箱SMTP服务2. 导入pom依赖3. 在配置文件中添加邮箱配置3. 封装EmailTask类4. 写测试类 1. 开启邮箱SMTP服务 这里以163邮箱为例&#xff0c;点击设置——更多设置——POP3/SMTP/IMAP——开启服务 根据提示开启服务之后会得到一个授权码&#xff0c;只显示一…

线性代数基础3 行列式

行列式 行列式其实在机器学习中用的并不多&#xff0c;一个矩阵必须是方阵&#xff0c;才能计算它的行列式 行列式是把矩阵变成一个标量 import numpy as np A np.array([[1,3],[2,5]]) display(A) print(矩阵A的行列式是&#xff1a;\n,np.linalg.det(A))array([[1, 3],[2, …

04 JavaScript学习:输出

JavaScript 没有任何打印或者输出的函数。 JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据&#xff1a; 使用 window.alert() 弹出警告框。使用 document.write() 方法将内容写到 HTML 文档中。使用 innerHTML 写入到 HTML 元素。使用 console.log() 写入到浏…