以下是SpringMVC提供自带的文件上传的bean. (在做上传是,最好是使用页面控件对文件类型大小等进行过滤。)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"> <!-- 上传文件编码格式 -->
<property name="maxUploadSize" value="10485760000"> <!-- 上传文件最大文件字节 -->
<property name="maxInMemorySize" value="40960"> <!-- 上传文件最大缓存字节 -->
</bean>
Spring通过对Servlet API的HttpServletRequest接口接口进行扩展, 使其能够很好
地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest
interface MultipartHttpServletRequest extends HttpServletRequest{
public MultipartFile getFile(String name);
public Map getFileMap();
public Iterator getFileNames();
}
页面中上传代码如下:
<form action="data/upload" method="post" enctype="multipart/form-data"> <!-- 这里method 必需为post 上传文件必须加enctype="multipart/form-data"-->
选择文件:<input type="file" name="file"/><br/>
<input type="submit" value="上传">
</form>
后台代码为:
@RequestMapping("/upload")
public ModelAndView upload(@RequestParam("file")CommonsMultipartFile file,HttpServletRequest req) throws UnsupportedEncodingException{
if(!file.isEmpty()){ //这里我上传的文件为2.txt
System.out.println("ContentType---->" + file.getContentType()); //text/plain 文件的ContentType
System.out.println("Name---->" + file.getName()); //file 对应页面上表单的name
System.out.println("OriginalFilename---->" + file.getOriginalFilename());//2.txt 文件名
System.out.println("Size---->" + file.getSize()); //23201 文件大小
System.out.println("StorageDescription---->" + file.getStorageDescription());//in memory
System.out.println("Bytes()---->" + file.getBytes()); //文件内容对应的字节码
try {
FileOutputStream os = new FileOutputStream("D:/update1/"+ new Date().getTime() +file.getOriginalFilename());//创建一个输出流
InputStream in = file.getInputStream(); //获取SpringMVC封装好的一个输入流
int b = 0; //以下就是读写文件了
while((b=in.read()) != -1){
os.write(b);
}
os.flush();
os.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
req.setAttribute("fileName", file.getOriginalFilename());
return new ModelAndView("/success");
}
以下是SpringMVC提供的另一种文件上传后台代码:
@RequestMapping("/upload2")
public ModelAndView upload2(HttpServletRequest request) throws UnsupportedEncodingException{
//获得上下文中CommonsMultipartResolver
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//因为request里面可以存很多类型的内容这里要放到request中保存的是否为Multipart类型
if(multipartResolver.isMultipart(request)){
//将HttpServletRequest强转为SpringMVC提供的MultipartHttpServletRequest类型
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
Iterator<String> it = multiRequest.getFileNames(); //获取所有上传文件的名字
while(it.hasNext()){
MultipartFile file = multiRequest.getFile(it.next()); //根据名字找到对应的文件,这里文件名和文件成键值对关系
if(!file.isEmpty()){
String fileName = file.getOriginalFilename(); //文件名
String path = "D:/update2/"; //需要上传的目录
File localFile = new File(path+fileName); //要将文件写至这个路径下的文件
try {
file.transferTo(localFile); //利用SpringMVC自带的读写文件方法,效率比上一个方法快
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return new ModelAndView("/success");
}
request.getSession().getServletContext().getContextPath()地址为:
/SpringMVC7
//相对路径
request.getSession().getServletContext().getRealPath("/")地址为: D:\Tomcat\Tomcat6.0\webapps\SpringMVC7\ //绝对路径