DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库, 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制.文档官网https://www.dropzonejs.com/.

java利用dropzone多文件上传案例效果图

  • html页面

使用dropzone的典型方式是通过创建一个 class 属性中包含 dropzone的form表单元素

<form action="#" class="dropzone dropzone-file-area" id="my-dropzone" enctype="multipart/form-data" method="post"><span ><i class="fa fa-upload"></i><font style="color: red">点击框内空白区域进行上传</font></span>
</form>
<button  class="login-button" onclick="uploadAllFile();" style="margin-top: 5px;">確認全部上傳</button>
  • 引入dropzone.min.css样式

<link rel="stylesheet" type="text/css" href="${webAppPath}/static/comp/dropzone/basic.min.css">
<link rel="stylesheet" type="text/css" href="${webAppPath}/static/comp/dropzone/dropzone.min.css">

额外新加的css样式

<style>.login-button { /* 按钮美化 */width: 270px; /* 宽度 */height: 40px; /* 高度 */border-width: 0px; /* 边框宽度 */border-radius: 3px; /* 边框半径 */background: #1E90FF; /* 背景颜色 */cursor: pointer; /* 鼠标移入按钮范围时出现手势 */outline: none; /* 不显示轮廓线 */font-family: Microsoft YaHei; /* 设置字体 */color: white; /* 字体颜色 */font-size: 17px; /* 字体大小 */}.login-button:hover { /* 鼠标移入按钮范围时改变颜色 */background: #5599FF;}</style>
  • 下载并引入dropzone.js

<script type="text/javascript" src="${webAppPath}/static/comp/dropzone/dropzone.min.js"></script>

初始化dropzone控件

功能选项

url:最重要的参数,指明了文件提交到哪个页面。 
method:默认为post,如果需要,可以改为put。 
paramName:相当于元素的name属性,默认为file。 
maxFilesize:最大文件大小,单位是 MB。 
maxFiles:默认为null,可以指定为一个数值,限制最多文件数量。 
addRemoveLinks:默认false。如果设为true,则会给文件添加一个删除链接。 
acceptedFiles:指明允许上传的文件类型,格式是逗号分隔的 MIME type 或者扩展名。例如:image/*,application/pdf,.psd,.obj 
uploadMultiple:指明是否允许 Dropzone 一次提交多个文件。默认为false。如果设为true,则相当于 HTML 表单添加multiple属性。 
headers:如果设定,则会作为额外的 header 信息发送到服务器。例如:{“custom-header”: “value”} 
init:一个函数,在 Dropzone 初始化的时候调用,可以用来添加自己的事件监听器。 
forceFallback:Fallback 是一种机制,当浏览器不支持此插件时,提供一个备选方案。默认为false。如果设为true,则强制 fallback。 
fallback:一个函数,如果浏览器不支持此插件则调用。

dictDefaultMessage:没有任何文件被添加的时候的提示文本。 
dictFallbackMessage:Fallback 情况下的提示文本。 
dictInvalidInputType:文件类型被拒绝时的提示文本。 
dictFileTooBig:文件大小过大时的提示文本。 
dictCancelUpload:取消上传链接的文本。 
dictCancelUploadConfirmation:取消上传确认信息的文本。 
dictRemoveFile:移除文件链接的文本。 
dictMaxFilesExceeded:超过最大文件数量的提示文本。

常用事件

以下事件接收 file 为第一个参数

addedfile:添加了一个文件时发生。 
removedfile:一个文件被移除时发生。你可以监听这个事件并手动从服务器删除这个文件。 
uploadprogress:上传时按一定间隔发生这个事件。第二个参数为一个整数,表示进度,从 0 到 100。第三个参数是一个整数,表示发送到服务器的字节数。当一个上传结束时,Dropzone 保证会把进度设为 100。注意:这个函数可能被以同一个进度调用多次。 
success:文件成功上传之后发生,第二个参数为服务器响应。 
complete:当文件上传成功或失败之后发生。 
canceled:当文件在上传时被取消的时候发生。 
maxfilesreached:当文件数量达到最大时发生。 
maxfilesexceeded:当文件数量超过限制时发生。

<script type="text/javascript">var myDropzone;//上传文件对象var signFileName = [];//上次,文件名称var fileUrl = [];$(function(){//禁止对所有元素的自动查找:Dropzone.autoDiscover = false;//加载上传控件$("#my-dropzone").dropzone({url: "${webAppPath}/upload_file_json",method : "post",paramName : "myFiles", // 默认为fileparallelUploads: 20, //最大并行处理量maxFiles : 20,// 一次性上传的文件数量上限uploadMultiple : true,//多文件上传autoProcessQueue : false,// 自动上传 默认为 truemaxFilesize : 1, // MBaddRemoveLinks:true, //添加删除按钮acceptedFiles : ".jpg,.png,.jpeg.JPG,.PNG,.JPEG", // 上传的类型dictMaxFilesExceeded : "您最多只能上传{{maxFiles}}个文件!",dictResponseError : '文件上传失败!',dictInvalidFileType : "你不能上传该类型文件,文件类型只能是*.jpg,*.png,*.jpeg,*.JPG,*.PNG,*.JPEG",dictFallbackMessage : "浏览器不受支持",dictFileTooBig:"文件过大({{filesize}}MB). 上传文件最大支持: {{maxFilesize}}MB.",dictRemoveFile: "删除",dictDefaultMessage:"",init : function() {myDropzone = this;this.on("addedfile", function(file) {// 上传文件时触发的事件//console.log("添加文件"+file.name);var fileName = file.name;if(signFileName != null && signFileName.length > 0){signFileName.push(fileName);}else{// 上传文件存在,就删除if(signFileName.join(",").indexOf(fileName) != -1){this.removeFile(file);}else{signFileName.push(fileName);}}});this.on("queuecomplete", function(file) {// 上传完成后触发的方法updateItemImg(signFileName,fileUrl);});this.on("removedfile", function(file) {// 删除文件时触发的方法var fileName = file.name;signFileName = $.grep(signFileName, function(value) {return value != fileName;});});this.on("error", function(file,msg,xhr){console.log("file upload error!!");});this.on("maxfilesexceeded", function(file){//当文件数量超过限制时发生//删除超过限制的文件layer.alert("上傳圖片數量一次性不能超過20張");this.removeFile(file);});this.on("success", function(file, result){fileUrl = result.url;});}});})var index = "";function uploadAllFile() {if(signFileName.length > 0){index = layer.load(0, {shade: false}); //0代表加载的风格,支持0-2myDropzone.processQueue();// 提交队列中的文件}else{layer.alert("請先選擇圖片");}}function updateItemImg(signFileName,fileUrl){var itemCodes = "";var urls = "";for(var i in signFileName){itemCodes += signFileName[i].split('\.')[0]+",";}for(var k in fileUrl){urls += fileUrl[k]+",";}$.ajax({url: "${webAppPath}/posItem/updateItemImgUrl",method: 'POST',dataType: 'json',data: {"itemCodes":itemCodes,"urls":urls},success: function (data) {layer.close(index);if(data.flag){layer.alert(data.msg, {skin: 'layui-layer-molv' //样式类名,closeBtn: 0}, function(){window.location.href='${webAppPath}'+'/posKeydesc/newList';});}else{layer.alert(data.msg)}}})}
</script>
  • Java后台文件上传代码

 @RequestMapping("/upload_file_json")public Object upload_media(StandardMultipartHttpServletRequest req, HttpServletResponse rsp) {try {String dirName = Objects.toString(req.getParameter("dir"), "image");Subject subject = SecurityUtils.getSubject();Session session = subject.getSession();String currCompany = (String) session.getAttribute("currCompany");if(AppUtils.isBlank(currCompany)){ModelAndView errorMv = new ModelAndView("/redirect:/403");errorMv.addObject("message", "缺少公司慘數");return errorMv;}//文件保存目錄路徑//rootPath/dirPath/dirName/ymdPath/fileNameString ymdPath = DateUtils.formatDate(new Date(), "yyyy_MM_dd") + "/";String dirPath = "/" + currCompany + "/";String rootPath = FileConfigUtils.getImagesSavePath();String os = System.getProperty("os.name");if (os.toLowerCase().startsWith("linux")) {//rootPath = SystemManager.inst().upload_path;}String filePath = dirPath + dirName + "/" + ymdPath;/*新文件名字的命名規則**/Function<String, String> nameFunc = fileName -> {String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();//檢查後綴名String newFileName = IDManager.generateID();return newFileName + "." + fileExt;};rsp.setContentType("text/html; charset=UTF-8");if (!ServletFileUpload.isMultipartContent(req)) {return getError("請選擇文件。");}//檢查目錄File uploadDir = new File(rootPath);//檢查目錄/* if(!uploadDir.isDirectory()){System.out.println("上傳目錄不存在。");return getError("上傳目錄不存在.");}*///檢查目錄寫權限if (!uploadDir.canWrite()) {System.out.println("上傳目錄沒有寫權限。");return getError("上傳目錄沒有寫權限。");}List<String> url = upload_multi_file(rootPath, filePath, nameFunc, req);System.out.println("************富文本框上傳圖片地址************" + url);JSONObject ret = new JSONObject();ret.put("error", 0);ret.put("url", url);return ret;} catch (Exception e) {e.printStackTrace();return getError("未知錯誤");}}private String getError(String message) {JSONObject ret = new JSONObject();ret.put("error", 1);ret.put("url", message);return ret.toJSONString();}public List<String> upload_multi_file(String saveRootPath, String filePath, Function<String, String> nameFunc, StandardMultipartHttpServletRequest freq) {StopWatch stopWatch = new StopWatch("upfile");stopWatch.start("save file");String saveUrl = "/" + filePath;String realpath = saveRootPath + filePath;File dir = new File(realpath);System.out.println("exists = "+dir.exists());if (!dir.exists()) {dir.mkdirs();}//String file_url[] = new String[1];List<String> urlList = new ArrayList<>();try {freq.getMultiFileMap().values().stream().forEach(files -> {files.stream().forEach((MultipartFile file) -> {try {String fileName = file.getOriginalFilename();if (AppUtils.isBlank(fileName)) {System.out.println("upload failed because of nofiles fileName=" + fileName);return;}String _new_file_original_name = fileName;if (null != nameFunc) {_new_file_original_name = nameFunc.apply(fileName);} else {_new_file_original_name = fileName;}File newFile = new File(dir, _new_file_original_name);file.transferTo(newFile);//file_url[0] = saveUrl + newFile.getName();urlList.add(FileConfigUtils.getImagesServerUrl()+saveUrl + newFile.getName());} catch (IOException e) {e.printStackTrace();}});});} catch (Exception e2) {e2.printStackTrace();return urlList;}stopWatch.stop();return urlList;}
}

java利用dropzone多文件上传相关推荐

  1. Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题

    我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jquery form.js可以达到异步上传的目的,但最重要的问题在于,它不能够进行多个文件的上传 ...

  2. selenium autoit java_selenium+java利用AutoIT实现文件上传

    1.AutoIT介绍 AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘.鼠标.窗口等操作,实现自动化. 2.实现原理 利用AutoIT编写合适的脚本,然后将脚本编译成可执行文 ...

  3. 利用MultipartFile实现文件上传

    利用MultipartFile实现文件上传 在java中上传文件似乎总有点麻烦,没.net那么简单,记得最开始的时候用smartUpload实现文件上传,最近在工作中使用spring的Multipar ...

  4. Dropzone单文件上传、多文件上传、文件夹上传,springmvc接收,上传至Minio的一系列问题

    0 前言 1.项目需要上传文件和大量的文件夹,页面只有一个input file标签会很丑,偶然间得知dropzone类库, 决定使用. 2. 项目后端采用springmvc接收,调用minio代码上传 ...

  5. DropZone(文件上传插件)

    1. html文件 dropzone的原理是模拟表单来上传文件,html中的元素有多重形式. 可以建立一个form表单: 1 2 3 <form id="dropz" act ...

  6. java formfile_基于Struts文件上传(FormFile)详解

    Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 名字: 头像: 2.在Form表单中定义FormFile /* * Generated by MyEclipse Strut ...

  7. dropzone多文件上传

    一.文件引入,具体修改对应的路劲 下载所需dropzone文件的路径:dropzone文件 <link rel="stylesheet" type="text/cs ...

  8. 转 [JAVA] 使用 common-fileupload 实现文件上传

    就在前段时间,还在苦于找到不到合适的上传组件,虽然很早就知道了 common-fileupload,但当时却因为没有找到如何获取表单参数的方法而使用 jspSmartUpload,历尽艰辛终于找到了它 ...

  9. java基于servlet的文件上传

    研究了一天终于将java上传文件看懂了,当然懂的仅仅是皮毛,不妨记下来防止以后忘了. 我们在网上看关于文件的上传有很多的介绍,当然有的可以使用有的则不合适:我们首先来看前台的界面 <!DOCTY ...

最新文章

  1. PDFMaker无法找到Adobe PDF Printer的打印机驱动
  2. php查询过滤字段,PHPelasticsearch过滤查询字符串搜索
  3. 在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……
  4. ios实例开发精品文章推荐(8.5)
  5. 为什么需要MiniDao? 新持久层 3.5.1 版本发布,让hibernate跟mybatis一样灵活
  6. Linux 下如何查找木马并处理
  7. html li之间的间隙,求助大神 如让图片展示在li标签里面,不要间隙 谢谢
  8. 庄河投资10亿元强力打造“智慧城市”
  9. 如何成为一名网络工程师
  10. iOS 面试题分析(一)
  11. ILSpy的下载与使用
  12. anjuta 连接mysql_anjuta的基本使用方法(包括如何设置MYSQL)
  13. 好用的3D建模软件,就是不用?
  14. 2sum/3sum/ksum 问题
  15. 计算机网络基础 课程设计体会,计算机网络课程设计心得体会.pdf
  16. Android系统关于音量相关的控制-初识
  17. VNCTF2021 几个题解writeup
  18. 二极管和稳压管的区别
  19. Python常见实体提取库Duckling,多语言,实体如日期、金额、距离
  20. Latex加批注 更改

热门文章

  1. python2020安装教程_PyCharm 2020.2.2 x64 下载并安装的详细教程
  2. MFC实战篇——提示框随鼠标移动动态响应
  3. can光端机、can转光纤或can光纤转换器功能特点介绍
  4. 云队友丨比努力更重要的,是提升你的思维层次
  5. 全国计算机数字图形图像应用技术等级二级,全国计算机数字图形图像应用技术等级考试一级...
  6. 多重继承《C++ primer 3th》
  7. 成长为架构师途中的一些思考
  8. spark(56) -- SparkMllib -- SparkMllib的功能和应用场景
  9. 向量几何在游戏编程中的使用6
  10. 游戏中 ----三维空间中的 向量