Spring MVC 的文件上传

jopen 9年前

springmvc中web-xml中的配置

<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/dispatcherServlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

在spring的applicationContext.xml中配置:

<!-- 上传拦截,如最大上传值及最小上传值 -->  
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- one of the properties available; the maximum file size in bytes -->  
        <property name="maxUploadSize" value="10000000" /><!-- 10M -->  
    </bean> 

在服务端有两种方式获取文件:

第一种:

<p>@RequestMapping(value = "/jsp/test/upload", method = RequestMethod.POST)
// 将文件上传请求映射到该方法
public String handleFormUpload(// 设置请求参数的名称和类型
@RequestParam("file") CommonsMultipartFile mFile) { // 请求参数一定要与form中的参数名对应


if (!mFile.isEmpty()) {
log.info("上传文件的名字:" + mFile.getOriginalFilename());
// String path = this.servletContext.getRealPath("/tmp/");
// //获取本地存储路径
File file = new File("D:/myfile");
if (!file.exists()) file.mkdirs();
File file1 = new File("d:/myfile/" + new Date().getTime() + ".xls"); // 新建一个文件
try {
mFile.getFileItem().write(file1); // 将上传的文件写入新建的文件中
log.info("=======文件上传成功====");
} catch (Exception e) {
e.printStackTrace();
}</p>

第二种 非注解的形式:

 

<!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean -->
<context:component-scan base-package="com.ultrapower.portal" />

<!--     启动Spring MVC的注解功能 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
</bean>

<bean id="fileUploadController" class="com.ultrapower.portal.controller.FileUploadController">
<property name="exceptionFlowService" ref="exceptionFlowService"></property>
</bean>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<map>
<entry key="/home.do" value="homeController" />
<entry key="/jsp/upload.do" value="fileUploadController" />
</map>

</property>
</bean>

 

<!-- 页面选择 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" /> <!-- 前缀 -->
<property name="suffix" value=".jsp" />   <!-- 后缀 -->
</bean>

<p>@Override
protected ModelAndView defaultHandler(HttpServletRequest request, HttpServletResponse response) throws Exception {
String message = "";
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// List items = upload.parseRequest(request);
try {
List items = upload.parseRequest(request);// 上传文件解析
Iterator itr = items.iterator();// 枚举方法
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if (item.isFormField()) {// 判断是文件还是文本信息
log.info("表单参数名:" + item.getFieldName() + ",表单参数值:" + item.getString("UTF-8"));
}
else {
if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件
// item.getName()返回上传文件在客户端的名称
log.info("上传文件的大小:" + item.getSize() + ";上传文件的类型:" + item.getContentType() + "上传文件的名称:"
+ item.getName());


// 此时文件暂存在服务器的内存当中 把文件保存在服务器上
//                      
// File tempFile = new File(item.getName());// 构造临时对象
// File file1 = new File("D:/xin");
// if (!file1.exists()) file1.mkdirs();
// File file = new File("D:/xin/",
// tempFile.getName());
// // if(file.getParentFile()==null)file.mkdirs();
// // 获取根目录对应的真实物理路径
// item.write(file);// 保存文件在服务器的物理磁盘中
// InputStream in = new FileInputStream(file);
// request.setAttribute("upload.message", "上传文件成功!");//</p>

 

jsp页面:

 <body>
  <h1>
   Spring MVC 3.0 文件上传测试
  </h1>   
<!--  //action里的html是后缀名,不是HTML文件,用于spring对请求进行拦截判断-->
  <form method="post" action="upload.do?method=fileUpload" enctype="multipart/form-data">其中method的是非注解的形式调用别的方法时传递的参数
<!--   <input type="text" name="name" />-->
   <input type="file" name="file" />
   <input type="submit" />
  </form>
 </body>