学习SpringMVC——上传文件
来源:互联网 发布:村上春树跑步语录知乎 编辑:程序博客网 时间:2024/05/19 12:26
文件上传也是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>
上面两种方法经过实测,都是可以的。
博客到此结束,如有错漏之处,欢迎留言指正。
- 学习SpringMVC——上传文件
- SpringMVC学习(九)——SpringMVC中实现文件上传
- SpringMVC学习---------文件上传
- SpringMVC学习 文件上传
- SpringMVC——文件上传
- SpringMVC—单文件上传
- SpringMVC—多文件上传
- springmvc学习笔记(17)——文件上传
- SpringMVC学习之上传文件
- Springmvc学习(07)-文件上传
- SpringMVC札集(08)——文件上传
- SpringMVC—另一种方式文件上传
- SpringMVC学习笔记四之文件上传
- SpringMVC学习笔记--文件上传与MultipartResolver
- SpringMVC 学习笔记(八)文件上传
- springmvc学习笔记(九)文件上传
- Spring学习笔记-SpringMVC文件上传
- 学习SpringMVC(二十二)之文件上传
- oracle 常用语法(转载)
- java读取资源文件的五种方式 (转载)
- 微信分享突然失效的解决方法记录
- 清除浮动的方法以及各自的优缺点
- 5. pstack 跟踪进程栈
- 学习SpringMVC——上传文件
- table排序
- java中list根据两个属性进行分组
- Mongodb 源码分析:整体架构
- R语言入门-1
- SVN常用命令
- Hibernate----lazy的使用
- Java语法基础练习题2
- MCU内存分配