HTML5 多图片上传(前端+后台详解)

HTML5 多图片上传(前端+后台详解)

    • 1、参考jquery插件库
    • 2、修改代码
    • 3、添加的后台代码
    • 4、删除的后台代码

1、参考jquery插件库

手机端实现多图片上传

2、修改代码

我发现他这里的代码仅仅只是显示出来了,对后台一点作用都没有,于是我对该代码进行了修改
注意:我这里用了vue.js,直接用可能有些地方会报错,请大家修改后使用

imgChange :function (obj1, obj2,id) {var id = id;//console.info(id);//获取点击的文本框var file = document.getElementById(id);//存放图片的父级元素var imgContainer = document.getElementById(obj1);//获取的图片文件var fileList = file.files;//文本框的父级元素var input = document.getElementById(obj2);var imgArr = [];//var imgUrlArr = [];//遍历获取到得图片文件for (var i = 0; i < fileList.length; i++) {var imgUrl = window.URL.createObjectURL(file.files[i]);//console.info(imgUrl);//回显图片var imgList = document.getElementsByClassName("z_addImg");imgArr.push(imgUrl);var img = document.createElement("img");img.setAttribute("src", imgArr[i]);img.setAttribute("id",id+"_"+(imgList.length+1));var imgAdd = document.createElement("div");imgAdd.setAttribute("class", "z_addImg");imgAdd.appendChild(img);imgContainer.appendChild(imgAdd);//下面的这段代码是我自己添加的,每添加一张图片就上传到服务器并给数据库插入一条记录//思路大概是把我们上传的图片转成base64的格式,然后把base64放进dealImage()方法中进行压缩,因为有的图片可能很大,这个时候我们需要把图片压缩一下,不想压缩的就把dealImage()方法删掉就好了。//把图片转成base64然后上传var base64 = "";var str = "";var dealImage = this.dealImage;var reader = new FileReader();reader.readAsDataURL(file.files[i]);reader.onload = function(){base64 = this.result;dealImage(base64, 500, useImg);function useImg(base64) {str= base64;//这个就是我们最后需要的http({data: {encode:base64},url: 'projectFile/saveCheckPhoto',type: 'post',dataType: 'json',async: false,success: function(data) {}})};};};this.imgRemove();},// 压缩图片
dealImage :function (base64, w, callback) {var newImage = new Image();var quality = 0.6;    //压缩系数0-1之间newImage.src = base64;newImage.setAttribute("crossOrigin", 'Anonymous');	//url为外域时需要var imgWidth, imgHeight;newImage.onload = function () {imgWidth = this.width;imgHeight = this.height;var canvas = document.createElement("canvas");var ctx = canvas.getContext("2d");if (Math.max(imgWidth, imgHeight) > w) {if (imgWidth > imgHeight) {canvas.width = w;canvas.height = w * imgHeight / imgWidth;} else {canvas.height = w;canvas.width = w * imgWidth / imgHeight;}} else {canvas.width = imgWidth;canvas.height = imgHeight;quality = 0.6;}ctx.clearRect(0, 0, canvas.width, canvas.height);ctx.drawImage(this, 0, 0, canvas.width, canvas.height);var base64 = canvas.toDataURL("image/*", quality); //压缩语句// 如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间,请加以下语句,quality初始值根据情况自定// while (base64.length / 1024 > 150) {// 	quality -= 0.01;// 	base64 = canvas.toDataURL("image/jpeg", quality);// }// 防止最后一次压缩低于最低尺寸,只要quality递减合理,无需考虑// while (base64.length / 1024 < 50) {// 	quality += 0.001;// 	base64 = canvas.toDataURL("image/jpeg", quality);// }callback(base64);//必须通过回调函数返回,否则无法及时拿到该值}
},//删除
imgRemove:function () {var projectId = getQueryString("projectId");var institutionsId = getQueryString("institutionsId");var imgList = document.getElementsByClassName("z_addImg");var mask = document.getElementsByClassName("z_mask")[0];var cancel = document.getElementsByClassName("z_cancel")[0];var sure = document.getElementsByClassName("z_sure")[0];for (var j = 0; j < imgList.length; j++) {imgList[j].index = j;imgList[j].onclick = function() {var t = this;mask.style.display = "block";cancel.onclick = function() {mask.style.display = "none";};sure.onclick = function() {mask.style.display = "none";t.style.display = "none";//在这里我进行了一个删除操作,把数据库和服务器上的图片给删掉//这个为该图片的id,用来区分具体为那个图片var imgId = $(t).find("img").attr("id");//这个是删除方法,同时删除服务器文件和数据库记录http({data: {originalName:imgId,projectId: projectId,institutionsId: institutionsId,},url: 'projectFile/deleteCheckPhoto',type: 'post',dataType: 'json',async: false,success: function(data) {}})};}};
}

3、添加的后台代码

后台代码仅供参考
在这里插入图片描述
这个是在yml中定义的,我定义的是D:/file下面。你也可以直接写死

	@Value("${store.dir}")private String storeDir;public Result saveCheckPhoto(ProjectFile projectFile){Result result = new Result();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String fileAdd = sdf.format(new Date());//图片名称是  当前日期    避免数据重复String fileName = fileAdd  + ".jpg";//这个步骤是把base64转成图片,并存在storeDir+"/checkPhoto/"+fileName这个目录下,这个storeDir是我们自己定义的,比如这个是D:/fileBase64ToPicture.GenerateImage(projectFile.getEncode(),storeDir+"/checkPhoto/"+fileName);String url = "/res/file/get/" + "checkPhoto" + "/" + fileName;projectFile.setId(UUIDTool.createUUID());projectFile.setUrl(url);projectFile.setCreateTime(new Date());projectFile.setFileType("jpg");projectFile.setType("checkPhoto");projectFile.setName(fileName);projectFileMapper.insert(projectFile);result.setMessage("保存成功!");result.setCode(1);return result;}

在这里面有个Base64ToPicture方法,以及以后需要显示,这个时候大家可以去看我以前的写一篇文章
jSignature签名的用法,一文教会你(二)后台代码
这篇博文详细讲解了我们需要用到什么工具类以及怎么回显;

4、删除的后台代码

public Result deleteCheckPhoto(ProjectFile projectFile){Result result = new Result();String contentId = projectFile.getOriginalName().substring(0,32); List<ProjectFile> list = projectFileMapper.queryCheckPhoto(projectFile);//这里是为了防止空指针if(list.size()>0){UploadUtil.delete(list.get(0).getUrl(),"D://ms_file");int count = projectFileMapper.deleteByPrimaryKey(list.get(0).getId());}result.setMessage("删除成功!");result.setCode(1);return result;
}

UploadUtil方法也在jSignature签名的用法,一文教会你(二)后台代码博文里。

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

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

相关文章

vue2.0移动端自定义性别选择提示框

这篇文章主要是简单的实现了vue2.0移动端自定义性别选择的功能&#xff0c;很简单但是经常用到&#xff0c;于是写了一个小小的demo&#xff0c;记录下来。 效果图&#xff1a; 图片.png实现代码&#xff1a; <template><div class"app"><div class&q…

微信小程序入门的一些建议,替大家踩坑

小程序入门教程1&#xff0c; 建议先去看官方文档2&#xff0c;说说app.json这个文件3、app.js4、点击事件5、跳转页面最后要说一下我踩的一个大坑&#xff0c;样式问题1&#xff0c; 建议先去看官方文档 微信小程序官方文档 官方文档里有下载微信开发者工具的地址&#xff0c…

云服务器Linux安装,配置,使用nginx

云服务器Linux安装&#xff0c;配置&#xff0c;使用nginxlinux安装nginxnginx的使用linux安装nginx 检查是否安装了GCC&#xff08;可在任何目录下输入&#xff09; yum list installed | grep "gcc"如果像下图一样&#xff0c;就说明安装了&#xff0c;反之没安装…

原来文化设计可以这样玩!

设计是什么&#xff1f;设计是一种以科学的方法去高效解决问题的办法&#xff0c;为之设计。例如一个灯&#xff0c;是为了照明&#xff0c;如果改良的灯&#xff0c;肯定是为了高效或者节能地解决照明这个需求&#xff0c;没毛病吧&#xff1f; 那么中秋的花灯是什么&#xff…

Windows安装python,以及python的集成开发环境Pycharm

安装python&#xff0c;以及python的集成开发环境Pycharm1&#xff0c;安装python&#xff08;Windows&#xff09;2&#xff0c;安装python的集成开发环境1&#xff0c;安装python&#xff08;Windows&#xff09; 进入python官网 点击图中标识出来的这个&#xff0c;是个ex…

Python 最难的问题

Python 最难的问题 超过十年以上&#xff0c;没有比解释器全局锁&#xff08;GIL&#xff09;让Python新手和专家更有挫折感或者更有好奇心。 未解决的问题 随处都是问题。难度大、耗时多肯定是其中一个问题。仅仅是尝试解决这个问题就会让人惊讶。之前是整个社区的尝试&#x…

解决echart中:Cannot read property ‘queryComponents‘ of undefined

在使用案例的echart的日历图表的时候&#xff0c;遇到了&#xff1a; Uncaught TypeError: Cannot read property ‘queryComponents’ of undefined 思考了很久&#xff0c;还百度了&#xff0c;结果还是不好使&#xff0c;最后终于被我在一个问答了找到了答案。 刚开始我是…

ListT.Find用法学习

泛型集合List<T>中的Find函数用于查找集合中符合指定条件的元素..相比foreach遍历元素&#xff0c;用Find函数查找&#xff0c;代码更简洁. 函数原型如下&#xff1a; public T Find(Predicate<T> match); 其中Predicate为C#定义好的委托&#xff0c;原型如下&…

从零开始的全栈工程师——html篇1.6

浮动与伪类选择器 一、浮动(float) 1.标准文档流 标准文档流是一种默认的状态 浏览器的排版是根据元素的特征&#xff08;块和行级&#xff09; 从上往下 从左往右排版 这就是标准文档流 2.浮动(float)float:left/right; 因为标准文档流会使页面的状态固定 元素会自动从左往…

idea+springboot+mongodb的简单测试使用分享

1&#xff0c;先去官网下载&#xff0c;选择版本&#xff0c;选择Windows&#xff0c;就可以点击下载了。 2&#xff0c;安装mongodb。 下一步安装 “install mongoDB compass” 不勾选&#xff08;当然你也可以选择安装它&#xff0c;可能需要更久的安装时间&#xff09;&a…

project01

the question 最早时间出发为第一架航班&#xff0c;接下来第二架要求&#xff1a;到达日期与第一架航班的出发日期的时间间隔不小于45分钟&#xff0c;且序号最小依次类推将所有航班排完the data the transmission of the data import numpy as np import pandas as pd from p…

idea+springboot+mongodb的实战使用分享

昨天的时候我们先在网上找了测试类&#xff0c;测试了一下mongdb的简单使用&#xff0c;今天就来实地在项目中用一用 没安装mongodb的参考我上一篇文章&#xff1a;ideaspringbootmongodb的简单测试使用分享 其实我们初学者最好是安装一个可视化的工具&#xff0c;这样方便我…

Nginx整合tomcat,实现反向代理和负载均衡

1.Nginx与Tomcat整合,通过Nginx反向代理Tomcat。 Nginx安装路径为&#xff1a;/usr/local//nginx 首先切换路径到&#xff1a;/usr/local//nginx/conf通过命令 vim/usr/local//nginx/conf/nginx.conf打开配置文件 修改Nginx配置文件&#xff1a;/usr/local//nginx/conf/nginx.…

ElasticSearch Java SpringBoot根据时间范围分组求和

需求是这样的&#xff1a; 近7天的用户登陆统计&#xff0c;根据日期来返回的要是data:[{date&#xff1a;“2021-04-01”,count:“1”}] Autowired private ElasticsearchTemplate elasticsearchTemplate;SimpleDateFormat formater new SimpleDateFormat("yyyy-MM-dd&…

开发springboot项目,遇到的一些问题总结

首先看一下我的项目目录吧 1&#xff0c;添加拦截器 我们做项目肯定要用到拦截器这个功能哈&#xff0c;没登录的话一些页面我们是不能访问的哈&#xff0c;这里是用到了HandlerInterceptor。 分别在图中的位置创建2个目录和2个文件&#xff1a; WebConfig: import org.sp…

centOS下lnamp安装

首先安装apache,mysql ,最后安装php 1>apache安装 安装&#xff1a;yum install -y httpd 运行&#xff1a;/bin/systemctl start httpd.service 执行完运行命令之后是看不到效果的&#xff0c;这时候再输入查看apache服务状态命令来查看服务是否已经启动&#xff1a; 查看状…

java使用itext填充pdf模板,超简单教学,有手就行

java使用itext填充pdf模板1、先去建一个Word文件&#xff0c;设置好想要填充的地方&#xff0c;留好位置&#xff0c;设置好下划线2、将Word另存为pdf3、打开电脑中的Adobe Acrobat pro DC&#xff08;这个应该win10 都有&#xff0c;搜索一下就出来了&#xff09;&#xff0c;…

KVM使用

这里使用的是Ubuntu18.04桌面版虚拟机 关于KVM可以看一下我之前的博客,有一些简单的介绍。 1.在打开虚拟机之前先开启此虚拟机的虚拟化功能。 2.安装KVM及其依赖项 wywy-virtual-machine:~$ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager 3.安装完成…

mybatis-plus3.5.1学习笔记

1、ID 1>id策略有6种&#xff1a; 想要id自增就在id上面添加 TableId(type IdType.AUTO)mybaits-plus的默认的主键策略是&#xff1a; TableId(type IdType.ID_WORKER)这样生成的是19位的数字id。 有的人喜欢使用UUID&#xff1a; TableId(type IdType.UUID)2、cre…

Python网络编程之socket编程

什么是Socket&#xff1f; Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议族隐藏在Socket接口后面&#xff0c;对用户来说&#xff0c;一组简单的接口就是全…