1.在实际开发中,系统设置一个专门的文件上传服务器,用于存储各种资源文件
我们在此演示,使用在文件系统内创建一个物理文件存储位置,和在tomcat中设置一个虚拟文件服务区
1.可以通过在eclipse内Tomcat服务器module视图下添加Web Module
Document base:虚拟目录对应的物理路径
Path: 虚拟目录
2.可以通过在tomcat安装目录下的conf目录下的server.xml文件中进行配置
<Context docBase="D:\Myself\Upload Physical Path\pic" path="/pic" reloadable="true"/>
注意: 在文件虚拟目录中一定要将文件目录进行分级,这样可以提高程序的IO效率,(假如不分级,将所有的文件放在一个目录下,查询文件时,需要遍历整个目录,实在是一件低效的事情)
在实际开发过程中,我们通常将文件按照日期分级(年,月,日),这样便可以按照年月日来快速查找文件,效率得到提高
2.要想使用文件上传功能需要引入文件上传实现类的jar包
<!--文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io}</version>
</dependency>
3.编写文件解析器 MultipartResolver 也是由前端控制器(DispatcherServlet)管理执行
<!--文件解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置文件最大上传大小 5M -->
<property name="maxUploadSize" value="5242880" />
</bean>
4.前端页面文件上传,需要申明类型
//注意文件上传标签的name必须和后端MultipartFile参数名一致,形成参数绑定
<form id="uploadForm" action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
<c:if test="${itemFile!=null}">
<img src="/pic/${itemFile}" width="200" height="100"><br>
</c:if>
<input type="file" name="itemFile"/><br>
<input type="submit" name="上传"/>
</form>
5.编写controller请求处理方法 "/fileUpload"
1.定义MultipartFile形参,将参数名和前端文件上传标签name一致,参数绑定
2.获取文件原始名,
3.使用uuid拼接文件名和其文件后缀,防止名字重复
4.将现有的文件名存储到数据库,将文件资源写到磁盘中
@RequestMapping(value = "/fileUpload")
public ModelAndView uploadFile(MultipartFile itemFile) throws Exception {
ModelAndView modelAndView = new ModelAndView();
String originalFilename = null;
String newFileName = null;
if (!itemFile.isEmpty()) {
// 获取文件原始名
originalFilename = itemFile.getOriginalFilename();
// 定义文件新名字
newFileName = UUID.randomUUID()
+ itemFile.getOriginalFilename().substring(originalFilename.lastIndexOf("."));
// 按日期分级存储
/*
* Calendar cal = Calendar.getInstance(); String
* Year=String.valueOf((cal.get(cal.YEAR))); //老外把一月份整成了0,翻译成中国月份要加1 String
* Month=String.valueOf((cal.get(cal.MONTH)+1)); String
* Day=String.valueOf((cal.get(cal.DATE)));
*/
// 将文件按照新名字存储到物理地址
// File file=new File("D:\\Myself\\Upload Physical Path\\pic\\"+Year+"\\"+Month+"\\"+Day+"\\"+newFileName);
// 将文件按照新名字存储到物理地址
File file = new File("D:\\Myself\\Upload Physical Path\\pic\\" + newFileName);
// 如果文件目录已经存在
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
} else {
itemFile.transferTo(file);
}
}else {
throw new CustomException("请用户选择需要上传的文件");
}
// 新的文件名存储到itemFile
modelAndView.addObject("itemFile", newFileName);
// 依旧返回index.jsp页面
modelAndView.setViewName("index.jsp");
return modelAndView;
}