文件上传下载
SpringMVC封装了Tomcat的上传文件功能
MultipartResolver接口
- MultipartResolver接口定义了文件上传过程中的相关操作,并对通用性操作进行了封装
- MultipartResolver接口底层实现类CommonsMultipartResovler
- CommonsMultipartResovler并未自主实现文件上传下载对应的功能,而是调用了apache的文件上传下载组件
pom.xml
<dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--jsp坐标--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><!--文件上传下载--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies><build><!--设置插件--><plugins><!--具体的插件配置--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins></build>
SpringMVC配置
<mvc:annotation-driven/><context:component-scan base-package="com.itzhuzhu"/><!--配置文件上传处理器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置上传大小--><property name="maxUploadSize" value="1024000000"/></bean>
控制器
@RequestMapping(value = "/fileupload")
public void fileupload(MultipartFile file){// transferTo上传文件用的file.transferTo(new File("file.png"));
}
page.jsp
<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %>
<h1>测试文件上传下载功能!</h1>
fileupload.jsp
<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %><form action="/fileupload" method="post" enctype="multipart/form-data"><%--文件上传表单的name属性值一定要与controller处理器中方法的参数对应,否则无法实现文件上传--%>上传LOGO:<input type="file" name="file"/><br/>上传照片:<input type="file" name="file1"/><br/>上传任意文件:<input type="file" name="file2"/><br/><input type="submit" value="上传"/>
</form>
文件上传注意事项
- 文件命名问题, 获取上传文件名,并解析文件名与扩展名
- 文件名过长问题(可以把用户上传的文件名保存到数据库,用UUID生成一个新的文件名,代替它。)
- 文件保存路径
- 重名问题
@RequestMapping(value = "/fileupload")
//参数中定义MultipartFile参数,用于接收页面提交的type=file类型的表单,要求表单名称与参数名相同
public String fileupload(MultipartFile file,MultipartFile file1,MultipartFile file2, HttpServletRequest request) throws IOException {System.out.println("file upload is running ..."+file);// MultipartFile参数中封装了上传的文件的相关信息// System.out.println(file.getSize()); 文件大小// System.out.println(file.getBytes().length); 文件所有的字节都在这个里面// System.out.println(file.getContentType()); 文件的类型// System.out.println(file.getName()); file文件名// System.out.println(file.getOriginalFilename()); 上传的文件名// System.out.println(file.isEmpty()); 是否为空//首先判断是否是空文件,也就是存储空间占用为0的文件if(!file.isEmpty()){//如果大小在范围要求内正常处理,否则抛出自定义异常告知用户(未实现)//获取原始上传的文件名,可以作为当前文件的真实名称保存到数据库中备用String fileName = file.getOriginalFilename();//设置保存的路径String realPath = request.getServletContext().getRealPath("/images");//保存文件的方法,指定保存的位置和文件名即可,通常文件名使用随机生成策略产生,避免文件名冲突问题file.transferTo(new File(realPath,file.getOriginalFilename()));}//测试一次性上传多个文件if(!file1.isEmpty()){String fileName = file1.getOriginalFilename();//可以根据需要,对不同种类的文件做不同的存储路径的区分,修改对应的保存位置即可String realPath = request.getServletContext().getRealPath("/images");file1.transferTo(new File(realPath,file1.getOriginalFilename()));}if(!file2.isEmpty()){String fileName = file2.getOriginalFilename();String realPath = request.getServletContext().getRealPath("/images");file2.transferTo(new File(realPath,file2.getOriginalFilename()));}// 重名的问题:不使用用户上传的文件名,把上传的文件名封装成一个变量,再使用UUID重新赋一个名,这样用户的是用户的,服务器的是服务器的String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();return "page.jsp";
}