1、上传测试的页面
注意form标签中的enctype属性这个值
默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
//简单的form表单上传图片
<form
action="${pageContext.request.contextPath}/upLoadController/upLoad.do"
method="post" enctype="multipart/form-data">
<!-- 正文区域 -->
<section class="content"> <!--产品信息-->
<div class="panel panel-default">
<div class="panel-heading">图片上传</div>
<input type="file" name="myPic"/>
</div>
2、上传与回显的Controller类
CommonsMultipartResolver 配置spring容器:https://blog.csdn.net/LuLuke_lucky/article/details/104850273
需要注意的一点是:图片提交input输入框的name属性值要与Controller中MultipartFile接口所声明的形参名一致,不然需要用@RequestParam注解绑定
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Controller
@RequestMapping("/upLoadController")
public class upLoadController {
//保存上传图片的地址必须是绝对路径
private static final String
UPLOAD_PATH="D:/javawork/comgm/src/main/webapp/upLoad";
//如何去实现参数的封装:上传的时候,如何给出判断或者验证
//需要: CommonsMultipartResolver 配置spring容器
@RequestMapping("/upLoad.do")
public ModelAndView upLoad(@RequestParam("myPic")MultipartFile myPic) throws IOException {
//1、文件在服务器上的存储
//先生成新的文件名(随机数生成)
UUID rid=UUID.randomUUID();
long uid=rid.getLeastSignificantBits();
//取出后缀名,进行字符串拼接
String filename=myPic.getOriginalFilename();
//根据源文件取最后一个“.”进行切割取出源文件的后缀名
String suffix=filename.substring(filename.lastIndexOf("."));
//当前日期获取
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String d=sdf.format(date);
//拼接图片保存的地址和文件新的后缀名日期+随机数+源文件的后缀名
File file=new File(UPLOAD_PATH+"/"+d+uid+suffix);
myPic.transferTo(file);
//2、文件地址的回显
ModelAndView mv=new ModelAndView();
mv.setViewName("upload");
mv.addObject("upload_file_path",file.getName());
//3、给出页面的跳转
return mv;
}
}
3、springmvc中的配置
需要注意在前端配置器中设置了拦截器的需要在springmvc.mvc中配置放置静态资源
<!--配置图片上传-->
<!--指出上传时,参数封装所用到的处理器时:
CommonsMultipartResolver 使用时,采用multipartResolver固定名进行引用
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10240000"/>
<!--需要上传文件的时候,一定要加上 uploadTempDir-->
<!-- <property name="uploadTempDir"-->
</bean>
<!--由于前端控制器配置的是拦截所有请求,所以要在在springmvc.xml中放行静态资源-->
<mvc:resources location="/upLoad/" mapping="/upLoad/**"/>
4、回显图片的src编写
注意不是访问工程目录下是访问服务器下的你保存的那个图片的文件夹
所以不要用${pageContext.request.contextPath}绝对路径来引入你的上传保存好的图片这样你刚刚保存的图片是找不到的,需要重新启动服务器才能访问到
${pageContext.request.contextPath}作用是取出部署的应用程序名
<img src="http://localhost:8080/upLoad/${upload_file_path}">