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

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF