【SpringMVC学习06】SpringMVC中实现文件上传

2024-09-07 20:58

本文主要是介绍【SpringMVC学习06】SpringMVC中实现文件上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 环境准备

springmvc上传文件的功能需要两个jar包的支持,如下

2. 单个文件的上传

2.1 前台页面

简单的写一下前台页面,注意一点的是form表单中别忘了写enctype=”multipart/form-data”属性

<tr><td>商品图片</td><td><c:if test="${itemsCustom.pic !=null}"><img src="/file/${itemsCustom.pic}" width=100 height=100 /><br /></c:if> <input type="file" name="items_pic"/></td>
</tr>

2.2 对多部件类型multipart解析

意思就是说针对上面的enctype=”multipart/form-data”类型,springmvc需要对multipart类型的数据进行解析,在springmvc.xml中配置multipart类型解析器即可。

<!-- 文件上传,需要配置MultipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置船上文件的最大尺寸为5MB --><property name="maxUploadSize" value="5242880"/><property name="defaultEncoding" value="utf-8"/>   
</bean>

2.3 创建文件保存的虚拟目录

 在上传文件之前,首先要创建一个虚拟目录来保存文件,这个虚拟目录会对应磁盘上的一个实际的目录,在实际中肯定会有一个服务器专门存储资源的,在这里我们就用本地来保存文件,然后映射一个虚拟目录,用来在程序中指定获取文件的路径(其实上面前台页面中,那个src=”/file/${itemsCustom.pic}”中的/file就是虚拟目录)。

创建的方法有两种:一是在Myeclipse中双击tomcat服务器,然后弹出下面的框框:

设置好后,保存即可,这样上传的文件都会保存到Document base指定的目录中,相当于虚拟映射到path指定的目录中,程序中获取这个文件,要从path指定的虚拟目录中获取,即我上面的/file。

第二种方法就是在tomcat的配置文件中配置一下,其实刚刚在Myeclipse中的操作已经自动写到这个配置文件中了,配置文件位置在tomcat目录/conf/server.xml中,看一下里面会多了一行:

这就是刚刚我配置的,它自动写到这个文件中了,所以我们也可以直接自己在文件中写,就不需要在Myeclipse中配置了。

2.4 编写后台Controller方法

 接下来就是重点了,前台传过来的文件,我们在controller中需要进行处理,然后保存到磁盘中,同时也就映射到了我们配置的虚拟路径中了,那么如何接收呢?看下面的代码

@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, HttpServletRequest request,Integer id,@Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,BindingResult bindingResult, MultipartFile items_pic)throws Exception {// 处理上传的单个图片    String originalFileName = items_pic.getOriginalFilename();// 原始名称// 上传图片if (items_pic != null && originalFileName != null && originalFileName.length() > 0) {// 存储图片的物理路径,实际中是要写到配置文件中的,不能在这写死String pic_path = "E:\\github\\develop\\upload\\temp\\";// 新的图片名称String newFileName = UUID.randomUUID()+ originalFileName.substring(originalFileName.lastIndexOf("."));     File newFile = new File(pic_path + newFileName);//新图片   items_pic.transferTo(newFile);// 将内存中的数据写入磁盘itemsCustom.setPic(newFileName);// 将新图片名称写到itemsCustom中} else {//如果用户没有选择图片就上传了,还用原来的图片ItemsCustom temp = itemsService.findItemsById(itemsCustom.getId());itemsCustom.setPic(temp.getPic());}// 调用service更新商品信息,页面需要将商品信息传到此方法itemsService.updateItems(id, itemsCustom);return "/WEB-INF/jsp/success.jsp";
}

首先来看一下形参,主要有ItemsCustom和MultipartFile类型的items_pic,我这里上传一张图片是ItemsCustom类的一个属性,所以有了这个形参,是为了写到该类中,另外前面的@Validated注解是我写springmvc校验的时候用的,跟这里文件上传无关。springmvc文件上传的类是MultipartFile,名items_pic必须和前台的name属性一致才行。

上传文件的逻辑是,首先判断有没有上传文件,如果上传了,那么对文件重新命名然后写到磁盘中。如果没有上传文件,那么我应该还是用原来的文件(图片),因为我写的这个例子是更新商品信息,对文件上传那里没有做非空验证,所以在这里写了else。

这样文件就上传完了,这是单个文件的上传。

3. 多个文件的上传

多个文件上传和单个文件上传原理一样的,不过在细节上会有点不同,待我一个个总结。首先在前台页面上要注意的一点是name属性必须一样,即:

<input type="file" name="items_pic"/>
<input type="file" name="items_pic"/>

然后就是后台接收的形参也要变,如下:

@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, HttpServletRequest request,Integer id,@Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,BindingResult bindingResult, @RequestParam MultipartFile[] items_pic)throws Exception {  //多个图片,不存数据库了,在此打印一下即可for(MultipartFile myfile : items_pic) {if(myfile.isEmpty()){  System.out.println("文件未上传");  }else{  System.out.println("文件长度: " + myfile.getSize());  System.out.println("文件类型: " + myfile.getContentType());  System.out.println("文件名称: " + myfile.getName());  System.out.println("文件原名: " + myfile.getOriginalFilename());  System.out.println("========================================");  //写入磁盘,和上面的单个文件上传一模一样String originalFileName = myfile.getOriginalFilename();String pic_path = "E:\\github\\develop\\upload\\temp\\";String newFileName = UUID.randomUUID()+ originalFileName.substring(originalFileName.lastIndexOf("."));File newFile = new File(pic_path + newFileName);myfile.transferTo(newFile);}  }   return "/WEB-INF/jsp/success.jsp";
}

如上,形参变成数组类型了,且前面要加上@RequestParam注解才行。然后获取的话,就是遍历这个数组,循环内部与上面的单个文件上传就一模一样了。看一下打印结果:

这篇关于【SpringMVC学习06】SpringMVC中实现文件上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2