前言

  图片上传是web项目常见的需求,我基于之前的博客的代码(请戳:formData批量上传的多种实现)里的第三种方法实现多图片的预览、上传,并且支持三种方式添加图片到上传列表:选择图片、复制粘贴图片、鼠标拖拽图片,同时支持从上传列表中移除图片(点击“X”号)

  

  效果演示

  选择图片

  页面操作

  后台接参

  复制粘贴

  页面操作,使用Ctrl C、 V 效果也一样

  后台接参

   

  鼠标拖拽

  页面操作

  后台接参

  show the code

  代码与之前的博客变化不大,主要是将p标签换成了img标签并且调整好样式,input加入了格式校验,使用window.URL.createObjectURL进行图片的预览等等,更多细节请直接看对比之前的代码与现在的代码

  注:项目用到了bootstrap、layer、thymeleaf,需要先引入相关文件

  css

  注意:样式在父页面引入

      .nav-bar {
   border-top: 1px solid #9E9E9E;
   margin: 10px 0 20px;
  }    .nav-bar-title {
   margin: -13px 0 0 35px;
   background-color: white;
   padding: 0 10px;
   float: left;
   color: #199ED8;
  } .images-remove {
font-size: 25px;
color: red;
cursor: pointer;
position: relative;
right: 0px;
top: -15px;
} .images-text-img {
float: left;
height: 100px;
width: 100px;
border: 1px solid #c2cad8;
margin-bottom: 5px;
} .images-text-img + i {
float: left;
line-height: 30px !important;
} .input-images {
width: 90% !important;
padding: 4px 12px !important;
} .images-list {
border: 1px solid #c2cad8;
padding: 10px;
width: 400px;
height: 355px;
overflow: auto;
}

  imagesUpLoad.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div th:fragment="imagesPage(applyId)">
<div class="nav-bar"><span class="nav-bar-title">图片上传</span></div>
<form th:applyId="${applyId}" class="form-horizontal images-form" enctype="multipart/form-data">
<div class='form-body'>
<div class='form-group'>
<div class="col-md-4">
<button type="button" class="btn btn-default images-btn" onclick="Images.appendImagesInput(this)">
选择图片
</button>
</div>
</div>
<div class='form-group'>
<div contenteditable class="images-list"> </div>
</div>
</div>
</form>
</div>
</body>
</html>

  js

  只需执行一次初始化函数即可

        var Images = {
//初始化
init:function(){
Images.removeImagesInputListener();
Images.pasteImagesListener();
},
//上传图片
upload: function (applyId) {
//终止上传
if (!applyId) {
layer.msg('images applyid is null');
return;
}
//添加附件
var formData = new FormData();
$("form[applyId='" + applyId + "']").find("input[name='images']").each(function (index, element) {
//上传的时候,先看FileList,在看我们自定义的filess
if ($(element).val() || element.filess) {
formData.append("images", element.files.length ? element.files[0] : element.filess);
}
}); //追加applyId到formData
formData.append("applyId", applyId); //执行上传
$.ajax({
url: ctx + "/upload",
type: "post",
data: formData,
processData: false,
contentType: false,
success: function (data) {
if (checkResult(data)) {
console.log('图片上传成功:', data); }
},
error: function (e) {
console.log('图片上传失败');
throw e;
}
});
},
//添加待上传图片
appendImagesInput: function (btn,file) {
//先追加html,input限制文件类型 可以直接写全,或者accept="image/*"
$(btn).parents('.images-form').find(".images-list").append("<div><input type=\"file\" name=\"images\" class=\"hidden\" accept=\"image/gif,image/jpeg,image/jpg,image/png,image/svg\"/></div>"); //最新追加的input
var images = $(btn).parents('.images-form').find(".images-list").find("input[name='images']"); if(file){
var $input = images[images.length - 1];
/*
在 HTML 文档中 ,<input type="file"> 标签是浏览器向服务器发送选中文件的。该元素有一个 value 属性,保存了用户指定的文件的名称,
为安全起见,file-upload 元素的value 属性是只读的,不允许程序员修改它的值,并且HTML value 属性也会被忽略。

解决方法:我们定义一个自己的属性来存储file,上传的时候做处理
*/
$input.filess = file;
var img = $("<img class='images-text-img' src=\"\"/>");
img.attr("src", window.URL.createObjectURL(file));
$($input).parent("div").append(img).append("<i class=\"fa fa-times images-remove\"></i>");
}else {
//绑定input的change事件,注意:当我们点击取消或×号时并不触发,但是无所谓,我们在upload方法进行过滤空的input就可以了
images[images.length - 1].onchange = function () {
var fileName = $(this).val();
if (fileName) {
var img = $("<img class='images-text-img' src=\"\"/>");
img.attr("src", window.URL.createObjectURL(this.files[0]));
$(this).parent("div").append(img).append("<i class=\"fa fa-times images-remove\"></i>");
} else {
$(this).parent("div").remove();
}
}; //触发最新的input的click
images[images.length - 1].click();
}
},
//删除待上传图片
removeImagesInputListener: function () {
$("body").on("click", ".images-remove", function (even) {
$(this).parent().remove();
});
},
//添加图片监听
pasteImagesListener: function () {
//粘贴事件
document.addEventListener('paste', function (event) {
if (event.clipboardData || event.originalEvent) {
var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
if (clipboardData.items) {
paste("paste",clipboardData.items);
}
}
}); //拖拽事件
document.addEventListener("dragenter", function (e) {
e.stopPropagation();
e.preventDefault();
}, false);
document.addEventListener("dragleave", function (e) {
e.stopPropagation();
e.preventDefault();
}, false);
document.addEventListener("dragover", function (e) {
e.stopPropagation();
e.preventDefault();
}, false);
document.addEventListener("drop", function (e) {
e.stopPropagation();
e.preventDefault();
paste("drop",e.dataTransfer.files);
}, false); var paste = function (type,files) {
var items = files, len = items.length, blob = [];
for (var i = 0; i < len; i++) {
if (items[i].type.indexOf("image") !== -1) {
//两种方式
if(type === "paste"){
blob.push(items[i].getAsFile());
}else if(type === "drop"){
blob.push(items[i]);
}
}
}
if (blob.length !== 0) {
for (var i = 0; i < blob.length; i++) {
Images.appendImagesInput($(".images-btn"),blob[i])
}
}
}
}
}; //调用初始化
Images.init();

  controller

    /**
* 批量上传
*/
@PostMapping("upload")
public ResultModel<List<AttachmentVo>> upload(MultipartFile[] images, @RequestParam("applyId") String applyId) {
System.out.println(images.length);
System.out.println(applyId);
return null;
}

  父页面调用

  直接在需要上传组件的地方嵌入

            <div th:replace="attachment/imagesUpLoad::imagesPage(123456)"></div>

  调用上传方法

  直接在浏览器的控制台调用

Images.upload("123456");

  后记

  还有一点不够完美的就是当我的页面出现多个上传组件时(情况参考之前博客了的新需求),通过复制粘贴、鼠标拖拽的方式时,调用Images.appendImagesInput追加html不好追加(目前是通过class去找),因为不好找到DOM对象,这里先暂时满足页面只有一个上传组件的情况,后面再进行升级

基于“formData批量上传的多种实现” 的多图片预览、上传的多种实现的更多相关文章

  1. jquery.uploadView 实现图片预览上传

    图片上传,网上有好多版本,今天也要做一个查了好多最终找到了一个uploadview 进行了一下修改 来看代码 @{ Layout = null; } <!DOCTYPE html> < ...

  2. webform的原生操作图片预览和上传

    1.使用input标签进行图片操作,input的标签有一个accept属性,accept 属性只能与 <input type="file"> 配合使用.它规定能够通过文 ...

  3. 【javascrpt】——图片预览和上传,兼容IE 9-

    下载DEMO:https://github.com/CaptainLiao/zujian/tree/master/Upload 对于现代浏览器来说,要实现图片预览非常简单: 1.fileReader. ...

  4. 对百度WebUploader的二次封装,精简前端代码之图片预览上传(两句代码搞定上传)

    前言 本篇文章上一篇: 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传) 此篇是在上面的基础上扩展出来专门上传图片的控件封装. 首先我们看看效果: 正文 使用方式同 ...

  5. 【项目相关】MVC中使用WebUploader进行图片预览上传以及编辑

    项目中需要用到多图片上传功能,于是在百度搜了一下,首先使用了kissy uploader,是由阿里前端工程师们发起创建的一个开源 JS 框架中的一个上传组件...但,后面问题出现了. 在对添加的信息进 ...

  6. H5实现多图片预览上传,可点击可拖拽控件介绍

    版权声明:欢迎转载,请注明出处:http://blog.csdn.net/weixin_36380516 在做图片上传时发现一个蛮好用的控件,支持多张图片同时上传,可以点击选择图片,也可以将图片拖拽到 ...

  7. js获取base64格式图片预览上传并用php保存到本地服务器指定文件夹

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  9. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

随机推荐

  1. BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案

    BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案 题意: 约翰的牧场里有 N 台机器,第 i 台机器的工作能力为 Ai.保罗阴谋破坏一些机器,使得约翰的工作效率变低.保罗可 ...

  2. Nginx重新编译添加新模块

    找到nginx的安装包目录,如果没有的话去官网重新下载 查看ngixn版本极其编译参数 /usr/local/nginx/sbin/nginx -V 进入nginx源码目录,重新设置nginx ./c ...

  3. JavaWeb学习总结(转载)

    JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件      JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件     JavaWeb学习总结(五十 ...

  4. redis与CPU、内存

    任何一个后端应用,包括代码都要考虑对于CPU和内存的影响.redis本质上类似于nodejs,单进程.单线程,事件驱动,但不同的是redis是CPU密集型的.这里列出了redis与内存CPU的相关考虑 ...

  5. redis的set类型!!!!

    一.概述 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度为 ...

  6. captcha.js一个生成验证码的插件,使用js和canvas生成

    一.captcha`captcha.js`是一个生成验证码的插件,使用js和canvas生成的,确保后端服务被暴力攻击,简单判断人机以及系统的安全性,体积小,功能多,支持配置. 验证码插件内容,包含1 ...

  7. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  8. Java 在PDF 中添加超链接

    对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接又可以分为:文本超链接,图像超链接,E-mai ...

  9. 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)

    在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就没有一个可以用的.安卓端可以给人一种定制和精美的感觉,这是网页所做不到 ...

  10. SQL Server AlwaysOn 集群 关于主Server IP与Listener IP调换的详细测试

    1. 背景 SQL Server 搭建AlwaysOn后,我们就希望程序连接时使用虚拟的侦听IP(Listener IP),而不再是主Server 的IP.如果我们有采用中间件,则可以在配置中,直接用 ...