文件上传也是Web项目中经常用到的功能。今天这篇博客就来讲讲SpringMVC的文件上传功能如何实现。
一、需要的jar包
文件上传功能需要两个jar包:commons-fileupload和commons-io,如下图。
二、配置Java bean
为实现文件上传,需要配置multipart类型解析器,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
可以通过maxUploadSize属性来设置上传文件的最大容量。下面的代码设置了上传的文件最大为5M:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"></property>
</bean>
三、编写Controller类
Controller类的代码如下:
@Controller("utils")
public class UtilsController {
@RequestMapping("/uploadFile")
public String uploadFile(MultipartFile pic,HttpServletRequest request){
//String path = request.getServletContext().getRealPath("/file");
String path = "E:\\imags\\";
String fileName = pic.getOriginalFilename();
String newFileName = new Date().getTime() + fileName;
File newFile = new File(path,newFileName);
try {
pic.transferTo(newFile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/home";
}
}
可以看到,在SpringMVC中上传文件是比较容易的,只要做两件事情:
(1)在方法入参中增加MultipartFile类的参数,注意参数名字需要与页面的标签的name属性值一致;
(2)调用transferTo方法。
四、JSP页面
一个简单的上传文件页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="uploadFile.action" method="post" enctype="multipart/form-data">
<div><input type="file" name="pic" /></div>
<div><input type="submit" value="Upload" /></div>
</form>
</body>
</html>
这里需要注意的是:form表单的enctype属性必须是multipart/form-data,才能上传文件。
五、上传文件名包含中文的文件
如果上传的文件的名字中包含中文,那么上传之后保存在服务器的文件名会出现乱码。怎么解决这个问题呢?
有两个办法,一个笨办法和一个简单的方法。
(1)笨办法是我自己琢磨的,出现乱码一般是编码格式的问题,所以我先找出文件名原本的编码格式是什么,然后将文件名的字符串转换成字节集合,再以“UTF-8”编码格式重新编码生成新的文件名,如下:
package com.entry_exit_management.controller;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
@Controller("utils")
public class UtilsController {
@RequestMapping("/uploadFile")
public String uploadFile(MultipartFile pic,HttpServletRequest request){
//String path = request.getServletContext().getRealPath("/file");
String path = "E:\\imags\\";
String fileName = pic.getOriginalFilename();
String encoding = UtilsController.getEncoding(fileName);
System.out.println(encoding);
try {
fileName = new String(fileName.getBytes(encoding),"UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String newFileName = new Date().getTime() + fileName;
File newFile = new File(path,newFileName);
try {
pic.transferTo(newFile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/home";
}
public static String getEncoding(String str) {
String encode = "GB2312";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GB2312
String s = encode;
return s; //是的话,返回“GB2312“,以下代码同理
}
} catch (Exception exception) {
}
encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是ISO-8859-1
String s1 = encode;
return s1;
}
} catch (Exception exception1) {
}
encode = "UTF-8";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是UTF-8
String s2 = encode;
return s2;
}
} catch (Exception exception2) {
}
encode = "GBK";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判断是不是GBK
String s3 = encode;
return s3;
}
} catch (Exception exception3) {
}
return "";
}
}
(2)很明显,上面的笨办法存在很大的缺陷,如果文件名的编码格式不是常见的那几种之一,那么就没有任何作用,我也不可能将所有的编码格式都囊括在getEncoding(String str)方法中去。那么简单的方法是什么呢?直接配置multipart类型解析器的“defaultEncoding”属性即可,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
</bean>
上面两种方法经过实测,都是可以的。
博客到此结束,如有错漏之处,欢迎留言指正。