SpringMVC快速入门第九讲——SpringMVC中实现文件上传

这一讲主要来讲一下SpringMVC是如何实现文件上传的,但请注意这里我只讲单个文件的上传。

环境准备

SpringMVC要想实现上传文件,就得需要两个jar包的支持,如下:
在这里插入图片描述
工程中肯定要导入以上两个jar包,因为CommonsMultipartResolver解析器要依赖commons-fileupload和commons-io这两个jar包。

单个文件的上传

前台页面

我们要改造一下itemEdit.jsp页面,主要是在form表单中添加商品图片一栏,效果我截图如下:
在这里插入图片描述
注意一点的是form表单中别忘了写enctype="multipart/form-data"属性。

对多部件类型multipart解析

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

<!-- 配置多媒体文件解析器 -->
<!-- 注意,这里id必须填写为multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 最大上传文件大小(即上传文件不能超过8M) -->
	<property name="maxUploadSize" value="8388608" />
</bean>

创建文件保存的虚拟目录

在上传文件之前,首先要创建一个虚拟目录来保存文件,这个虚拟目录会对应磁盘上的一个实际的目录,在实际开发中肯定会有一个服务器专门存储资源的,但在这里我们就用本地磁盘来保存文件,然后映射一个虚拟目录,用来在程序中指定获取文件的路径(其实上面前台页面itemEdit.jsp中,那个src="/pic/${item.pic}"中的/pic就是虚拟目录)。
创建一个虚拟目录来保存文件一共有两种方法:一种方法是在Eclipse中双击Tomcat服务器,就会弹出下面的框框。
在这里插入图片描述
选择Modules,然后点击【Add External Web Module…】,在弹出的窗口中进行如下操作,都在图里面了。
这里写图片描述
设置好之后保存即可,这样上传的文件都会保存到Document base指定的目录中,相当于虚拟映射到Path指定的目录中,程序中获取这个文件,要从Path指定的虚拟目录中获取,即我上面写的/pic。这里,我举一个例子,比方说将一个图片(例如1.jpg)拷贝到Document base指定的目录中,即F:\temp\images目录中,然后启动Tomcat服务器,在浏览器地址栏中输入http://localhost:8080/pic/1.jpg这样的url访问地址即可访问到该图片。
第二种方法就是在Tomcat服务器的配置文件(即server.xml)中配置一下,其实刚刚在Eclipse中的操作已经自动写到这个配置文件中了,看一下该文件会发现里面会多了一行。
这里写图片描述
这就是刚刚我配置的,它自动写到server.xml这个文件中了,所以我们也可以直接在该配置文件中进行配置,这样就不需要在Eclipse中配置了。

编写后台Controller方法

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

/**
  * 修改商品
  * 演示pojo参数绑定。注意,表单里面的元素的name属性要与pojo类中的属性一一对应得上,才能提交过来!
  * @param item
  * @return
  * @throws Exception 
  */					  //请求方式的限定,不写默认匹配所有请求方式
@RequestMapping(value="updateItem", method={RequestMethod.POST, RequestMethod.GET})
public String updateItem(Item item, MultipartFile pictureFile, Model model) throws Exception {
	//保存文件(图片)时,这个文件(图片)有的时候文件名可能会重复,你保存多了会把原来的文件(图片)给覆盖掉,这就不太合适了,所以可以为每个文件(图片)生成一个新的文件名
	//新的文件(图片)名字
	String newName = UUID.randomUUID().toString();
	//上传文件(图片)的原来的名字
	String oldName = pictureFile.getOriginalFilename();
	//截取文件(图片)的后缀,从.开始截取
	String sux = oldName.substring(oldName.lastIndexOf("."));
	//新建本地文件流
	File file = new File("F:\\temp\\images\\" + newName + sux);
	//写入本地磁盘
	pictureFile.transferTo(file);//transferTo方法可以将上传的文件(图片)写入本地磁盘
	
	//保存文件(图片)到数据库
	item.setPic(newName + sux);
	
	itemService.updateItem(item);
	model.addAttribute("item", item);
	model.addAttribute("msg", "修改商品信息成功");
	return "itemEdit";
}

注意,考虑到实际情况,保存文件(图片)时一般不只你一个人保存,那么这个文件(图片)有的时候文件名可能会重复,你保存多了会把原来的文件(图片)给覆盖掉,这就不太合适了,所以需要使用UUID算法为每个文件(图片)生成一个新的文件名。
然后,来看一下updateItem方法中的形参,主要有Item、Model以及MultipartFile类型的pictureFile,我这里上传的图片是Item类中的一个属性,所以有了这个形参,那么就可以写到该类中。SpringMVC文件上传的类是MultipartFile,参数名称pictureFile必须和前台页面itemEdit.jsp中的name属性一致才行。上传图片成功之后的效果类似于下面这样。
在这里插入图片描述
并且图片的文件名也保存到了数据库表中,如下图所示。
在这里插入图片描述
最后总结一下,我上传文件的逻辑可能判断不严谨,如果说要更加严谨一点的话,上传文件的逻辑就应是这样的:首先判断有没有上传文件,如果上传了,那么对文件重新命名然后写到磁盘中。如果没有上传文件,那么我应该还是用原来的文件(图片)。读者如果有兴趣可以参考下面的代码。

@RequestMapping(value="/updateItem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItem(Item item, MultipartFile pictureFile) throws Exception {

    // 处理上传的单个图片    
    String originalFileName = pictureFile.getOriginalFilename();// 原始名称
    // 上传图片
    if (pictureFile != null && originalFileName != null && originalFileName.length() > 0) {
        // 存储图片的物理路径,实际中是要写到配置文件中的,不能在这写死
        String pic_path = "F:\\temp\\images\\";
        // 新的图片名称
        String newFileName = UUID.randomUUID()
                + originalFileName.substring(originalFileName
                        .lastIndexOf("."));     
        File newFile = new File(pic_path + newFileName);//新图片   
        pictureFile.transferTo(newFile);// 将内存中的数据写入磁盘
        item.setPic(newFileName);// 将新图片名称写到itemsCustom中
    } else {
        //如果用户没有选择图片就上传了,还用原来的图片
        Item temp = itemsService.findItemsById(item.getId());
        item.setPic(temp.getPic());
    }

    // 调用service更新商品信息,页面需要将商品信息传到此方法
	itemService.updateItem(item);
	return "forward:itemEdit.action";
}

到这里,单个文件的上传我就已总结完了。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在Spring MVC实现文件上传,你需要进行以下几个步骤: 1. 引入依赖:在项目的pom.xml文件,添加对Spring MVC文件上传组件的依赖。 2. 在前端编写一个包含文件上传功能的form表单:在HTML页面,使用form表单标签,并设置属性enctype="multipart/form-data",并添加一个type为file的input标签,用于选择要上传的文件。 3. 在Spring MVC的配置文件配置文件上传器:在Spring MVC的配置文件(通常是一个XML文件),添加一个bean,其id为multipartResolver,类为org.springframework.web.multipart.commons.CommonsMultipartResolver。这是Spring提供的一个文件上传解析器。 4. 在Controller处理文件上传:在Spring MVC的Controller,添加一个方法用于处理文件上传的请求。该方法需要添加一个参数,用于接收上传的文件。在方法,你可以通过MultipartFile对象来访问上传的文件,并执行相应的操作。 下面是一个示例代码,展示了如何在Spring MVC实现文件上传: ```java @Controller public class FileUploadController { @RequestMapping(value = "/upload", method = RequestMethod.POST) public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理文件上传的逻辑 if (!file.isEmpty()) { // 获取上传的文件名 String fileName = file.getOriginalFilename(); // 进行处理... return "success"; } else { return "error"; } } } ``` 请注意,上述代码的"/upload"是文件上传的请求路径,你可以根据自己的需要进行修改。 总结一下,要在Spring MVC实现文件上传,你需要引入依赖、编写前端form表单、配置文件上传器,并在Controller处理文件上传的请求。希望这些信息对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringMvc上传文件(详细)](https://blog.csdn.net/weixin_55519875/article/details/128096289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值