##上传文件 Spring框架
####1、创建WEB页面
文件上传的HTML页面中需要表单,且method="post
和 enctype="multipart/form-data"
,使用的控件是<input type="file" />
:
<form method="post" action="upload.do"
enctype="multipart/form-data">
<div><input name="file" type="file" /></div>
<div><input type="submit" value="上传" /></div>
</form>
####2. 添加依赖
SpringMVC中的文件上传依赖apache的commons-fileupload
,所以,添加依赖:
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
####3. 配置CommonsMultipartResolver
使用SpringMVC的上传,必须在Spring的配置文件中配置CommonsMultipartResolver
,且id
必须是multipartResolver
,该节点可以有更多配置,也可以不添加配置,最简化配置如下:
<!-- CommonsMultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
####4. 创建控制器处理请求
在服务器端处理上传请求时,需要将用户提交的上传文件声明为CommonsMultipartFile
类型,它表示用户上传的文件,调用该参数对象的transferTo(File)
方法即可将文件保存在服务器端的某个位置,通常,推荐将文件保存在webapp
目录下,以便于用户可以通过HTTP协议进行访问,并且,通常还会专门创建某个文件夹,用于存储用户上传的文件,通过HttpServletRequest
对象的getServletContext.getRealPath(String)
方法可以获取到webapp
下某文件夹的实际路径:
@Controller
public class UploadController {
@RequestMapping("/upload.do")
public String handleUpload(
HttpServletRequest request,
@RequestParam("file") CommonsMultipartFile file)
throws IllegalStateException, IOException {
// CommonsMutltpartFile是SpringMVC封装的上传数据
String parentPath = request
.getServletContext().getRealPath("upload");
// 确定文件夹,是webapp下的upload
File parentFile = new File(parentPath);
// 确定文件名
String fileName = "1.jpg";
// 确定上传的文件存储到的目标文件
File dest = new File(parentFile, fileName);
// 将上传的数据进行存储
file.transferTo(dest);
return null;
}
}
通常,上传的文件都必须限制文件类型,可以通过CommonsMultipartFile
对象的String getContentType()
方法获取文件的MIME类型,例如image/jpeg
,更多类型可以在Tomcat的conf/web.xml
中查找。
且上传的文件必须限制文件大小,因为过大的文件可能导致上传体验较差,并且,产生的流量消耗较大,占用较多的服务器端存储空间,通过CommonsMultipartFile
对象的long getSize()
方法可以获取文件的大小,例如12345,是以字节为单位的。
还可以通过CommonsMultipartFile
对象的String ``getOriginalFileName()
方法获取原始文件名,即用户端的文件名,主要通过该文件名截取出文件的扩展名,用于最终保存文件。
最终保存的文件名应该自定义命名规则,以保证每个用户上传的文件彼此不会覆盖,通常会使用时间、随机数等作为文件名的某个部分。
除此以外,还可以通过getBytes()
和getInputStream()
获取用户上传的原始数据/流,然后自行创建输出流,将数据写入到服务器端的文件中,而自定义输出流的写入,可以根据实际情况提高写入效率!
关于在Spring的配置文件中配置的CommonsMultipartResolver
,可以配置以下属性:
- maxUploadSize:最大上传大小,即每次上传的文件不允许超过多少字节!假设同时上传5个文件,则5个文件的大小总和不允许超过设置值。
- maxUploadSizePerFile:每个上传的文件不允许超过多少字节,因为单次上传其实可以选中多个文件!假设同时上传5个文件,则每个文件的大小都不允许超过设置值,而5个文件的总大小允许超过设置值。.
- maxInMemorySize:上传的文件在内存中最大占多少空间。
- defaultEncoding:默认编码。
注意:在HTML页面中,在<input type="file" />
标签中添加multiple="multiple"
,则上传时可以同时选中多个文件提交上传,且,在服务器端处理时,处理请求的方法中应该声明CommonsMultipartFile[] files
参数来接收多个文件的数据。