许多案例都需要后台接受用户上传的图片并在显示信息时回调,使用SpringMVC可以很简单实现这个功能
1.配置虚拟目录
在开发时,如果我们把客户端上传的文件都放在服务器内的一个文件夹中,然后重新发布项目,图片存放的文件夹就会被覆盖掉,客户端的图片会消失造成数据丢失。因此我们需要把上传的资料都放在一个服务器外的文件夹,然后配置虚拟目录去调用。
配置方法:
在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:<Context docBase="D:\develop\upload\temp" path="/pic" reloadable="false"/>访问http://localhost:8080/pic即可访问D:\develop\upload\temp下的图片。
2.导包
文件的解析需要io流的包,须导入相应的包。
3.配置上传解析器(springmvc.xml)
<!-- 文件上传,id必须设置为multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件上传大小 -->
<property name="maxUploadSize" value="5000000" />
</bean>
4.前端页面修改
表单中上传图片需要把input标签中的type值改为file,然后在form标签中加入enctype="multipart/form-data"开启上传文件
5.修改处理器代码
首先需要在参数中绑定MultipartFile接口(实现类为之前在配置文件中配好的multipartResolver,会自动调用),他会帮我们接受客户端上传的文件,我们可以通过它获取上传的文件信息和实现把文件上传保存到相应的位置。
@RequestMapping("updateItem")
public String updateItemById(Item item, MultipartFile pictureFile) throws Exception {
// 图片上传
// 设置图片名称,不能重复,可以使用uuid
String picName = UUID.randomUUID().toString();
// 获取文件名
String oriName = pictureFile.getOriginalFilename();
// 获取图片后缀
String extName = oriName.substring(oriName.lastIndexOf("."));
// 开始上传保存到指定位置
pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));
// 设置图片名到商品中
item.setPic(picName + extName);
// ---------------------------------------------
// 更新商品
this.itemService.updateItemById(item);
return "forward:/itemEdit.action";
}