plupload+springMVC上传文件,包括解压缩上传

2024-03-10 00:58

本文主要是介绍plupload+springMVC上传文件,包括解压缩上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

uploadALLPic 单次上传多图片,uploadZip上传zip或Rar文件解压

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<html>
<head>
<title>批量上传照片</title>
</head>
<body><p>hello</p><script type="text/javascript" src="${ctx}/lib/plupload/moxie.min.js"></script><script type="text/javascript" src="${ctx}/lib/plupload/plupload.min.js"></script><script type="text/javascript" src="${ctx}/lib/plupload/zh_CN.js"></script><input type="button" value="上传" id="uploadALLPic" /><img src="" id="showPic"/><input type="button" value="上传zip" id="uploadZip"/><script type="text/javascript">$(function () {initALLPicUploader();initZipUploader();});//批量上传图片function initALLPicUploader() {var excelUploader = new plupload.Uploader({runtimes: 'html5,flash,html4',multipart: true,multi_selection: true,browse_button: 'uploadALLPic', // 按钮idfile_data_name: "file",url: '${ctx}/upload/all/photo',max_file_size: '10000mb',filters: {max_file_size: '10000mb',mime_types: [{title: "Image files", extensions: "jpg,gif,png,jpeg"}]},flash_swf_url: '${ctx}/lib/plupload/Moxie.swf',init: {FilesAdded: function () {$.messager.progress({title: '请稍候',msg: '上传附件',text: '上传中.......'});excelUploader.start();console.log("2")},FileUploaded: function (up, file, response) {$.messager.progress('close');console.log("3")var result = JSON.parse(response.response);console.log(result)if (result.success !== true) {$.messager.alert("操作提示", result.message, "info");return;} else {var options = {title: "操作提示",msg: result.message,showType: 'slide',timeout: 5000};$("#showPic").attr("src","${ctx}/lib/images/"+result.url+"");return;} },Error: function (up, err) {$.messager.progress('close');console.log("4")$.messager.alert("操作提示", "上传发生错误:" + err.code + ", " + err.message, "error");}}});excelUploader.init();}function initZipUploader() {var excelUploader = new plupload.Uploader({runtimes: 'html5,flash,html4',multipart: true,multi_selection: true,browse_button: 'uploadZip', // 按钮idfile_data_name: "file",url: '${ctx}/upload/zip',max_file_size: '10000mb',filters: {max_file_size: '10000mb',mime_types: [{title: "Zip", extensions: "zip,rar"}]},flash_swf_url: '${ctx}/lib/plupload/Moxie.swf',init: {FilesAdded: function () {$.messager.progress({title: '请稍候',msg: '上传附件',text: '上传中.......'});excelUploader.start();},FileUploaded: function (up, file, response) {$.messager.progress('close');var result = JSON.parse(response.response);console.log(result)if (result.success !== true) {$.messager.alert("操作提示", result.message, "info");return;} else {var options = {title: "操作提示",msg: result.message,showType: 'slide',timeout: 5000};return;} },Error: function (up, err) {$.messager.progress('close');$.messager.alert("操作提示", "上传发生错误:" + err.code + ", " + err.message, "error");}}});excelUploader.init();}</script></body>
</html>

相对应的controller及Util

    @RequestMapping(value="/upload/all/photo",method = RequestMethod.POST)public ModelAndView upload(@RequestParam(value = "file") MultipartFile file) {String url="";try {if (null != file) {url=uploadService.doALLImport(file);}} catch (Exception e) {return new ModelAndView(new MappingJackson2JsonView(), new HashMap<String, Object>() {{put("success", false);put("message", "出错");}});}final String pathUrl = url;return new ModelAndView(new MappingJackson2JsonView(), new HashMap<String, Object>() {{put("success", true);put("url", pathUrl);put("message", "批量上传照片完成!");}});     }@RequestMapping(value="/upload/zip",method=RequestMethod.POST)public ModelAndView uploadZip(@RequestParam(value = "file") MultipartFile file) {String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/lib");try {            if (null != file) {//解压处理UploadUtil.resolveCompressUploadFile(request, file, realPath);}} catch (Exception e) {return new ModelAndView(new MappingJackson2JsonView(), new HashMap<String, Object>() {{put("success", false);put("message", "出错");}});}return new ModelAndView(new MappingJackson2JsonView(), new HashMap<String, Object>() {{put("success", true);put("message", "解压上传文件完成!");}});   }

service

    //批量上传照片public String doALLImport(MultipartFile file) throws Exception {String prefixName = "";String fileName ="";if (null != file) {String myFileName = file.getOriginalFilename();String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/lib");      //设置路径if (myFileName.trim() != "") {//重命名上传后的文件名               Random ra = new Random();int raNum = ra.nextInt(100);//获取当前系统时间Long nowTime = System.currentTimeMillis();prefixName = nowTime + "" + raNum;//重命名上传后的文件名               fileName = myFileName;//定义上传路径  String path = realPath +"/images/"+ prefixName+fileName;File localFile = new File(path);file.transferTo(localFile);//保存数据库saveAllPhoto(prefixName+fileName,fileName);}}return prefixName+fileName;}public String saveAllPhoto(String path,String fileName) {// String name = picName.substring(0, picName.indexOf("."));           //去除后缀UploadPic uploadPic = new UploadPic();uploadPic.setName(fileName);   //图片原名称uploadPic.setUrl(path);       //路径(xml配置头)uploadPicMapper.insert(uploadPic); return path;}

PS:网上引用的zip解压代码块(基本思路都类似)

public class CompressFileUtils {/** * 解压到指定目录 * @param zipPath * @param descDir * @author*/  public static void unZipFiles(String zipPath,String descDir)throws IOException{  unZipFiles(new File(zipPath), descDir);  }  /** * 解压文件到指定目录 * @param zipFile * @param descDir * @author isea533 */  @SuppressWarnings("rawtypes")  public static void unZipFiles(File zipFile,String descDir)throws IOException{  File pathFile = new File(descDir);  if(!pathFile.exists()){  pathFile.mkdirs();  }  ZipFile zip = new ZipFile(zipFile);  for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){  ZipEntry entry = (ZipEntry)entries.nextElement();  String zipEntryName = entry.getName();  InputStream in = zip.getInputStream(entry);  String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;  //判断路径是否存在,不存在则创建文件路径  File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));  if(!file.exists()){  file.mkdirs();  }  //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压  if(new File(outPath).isDirectory()){  continue;  }  //输出文件路径信息  System.out.println(outPath);  OutputStream out = new FileOutputStream(outPath);  byte[] buf1 = new byte[1024];  int len;  while((len=in.read(buf1))>0){  out.write(buf1,0,len);  }  in.close();  out.close();  }   }  /** * 根据原始rar路径,解压到指定文件夹下.      * @param srcRarPath 原始rar路径 * @param dstDirectoryPath 解压到的文件夹      */public static void unRarFile(String srcRarPath, String dstDirectoryPath) {if (!srcRarPath.toLowerCase().endsWith(".rar")) {System.out.println("非rar文件!");return;}File dstDiretory = new File(dstDirectoryPath);if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹dstDiretory.mkdirs();}Archive a = null;try {a = new Archive(new File(srcRarPath));if (a != null) {a.getMainHeader().print(); // 打印文件信息.FileHeader fh = a.nextFileHeader();while (fh != null) {if (fh.isDirectory()) { // 文件夹 File fol = new File(dstDirectoryPath + File.separator+ fh.getFileNameString());fol.mkdirs();} else { // 文件File out = new File(dstDirectoryPath + File.separator+ fh.getFileNameString().trim());//System.out.println(out.getAbsolutePath());try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压. if (!out.exists()) {if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录. out.getParentFile().mkdirs();}out.createNewFile();}FileOutputStream os = new FileOutputStream(out);a.extractFile(fh, os);os.close();} catch (Exception ex) {ex.printStackTrace();}}fh = a.nextFileHeader();}a.close();}} catch (Exception e) {e.printStackTrace();}}
}
public class UploadUtil {/*** 解析上传的压缩文件* @param request 请求* @param file 上传文件* @return* @throws Exception*/public static String resolveCompressUploadFile(HttpServletRequest request,MultipartFile file,String path) throws  Exception  {/* 截取后缀名 */String fileName = file.getOriginalFilename();int pos = fileName.lastIndexOf(".");String extName = fileName.substring(pos+1).toLowerCase();//判断上传文件必须是zip或者是rar否则不允许上传if (!extName.equals("zip")&&!extName.equals("rar")) {throw new Exception("上传文件格式错误,请重新上传");}//重命名上传后的文件名               Random ra = new Random();int raNum = ra.nextInt(100);//获取当前系统时间Long nowTime = System.currentTimeMillis();        String saveName = nowTime + "" + raNum + "."+extName;//文件名String saveFileName = saveName.substring(0, saveName.lastIndexOf("."));// 根据服务器的文件保存地址和原文件名创建目录文件全路径File pushFile = new File(path  + "/images/" +saveFileName+"/"+ saveName);      File descFile = new File(path+"/images/"+saveFileName);if (!descFile.exists()) {descFile.mkdirs();}//解压目的文件String descDir = path +"/images/"+saveFileName+"/";file.transferTo(pushFile);//zipif (extName.equals("zip")) {CompressFileUtils.unZipFiles(pushFile, descDir);}else if (extName.equals("rar")) { //rar    CompressFileUtils.unRarFile(pushFile.getAbsolutePath(), descDir);           } else {throw new Exception("文件格式不正确不能解压");}return saveFileName;} 
}

至于上传或者解压的文件路径根据项目目录自行可调节

这篇关于plupload+springMVC上传文件,包括解压缩上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792505

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1