天天看点

java web文件上传-spring web MVC

之前我们介绍了在无框架支持的环境下如何进行文件上传的方式,此种方式比较基础,相对而言比较麻烦一点。

在接下来的文章中,我们将借助spring web mvc框架简化文件上传的操作。

一、创建web项目,导入spring web mvc支持包以及上传文件jar包

java web文件上传-spring web MVC

二、在web.xml中配置spring mvc入口,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<!-- spring mvc入口 -->
  <servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.form</url-pattern>
	</servlet-mapping>
	
	<!-- 配置编码过滤器,解决中文乱码 -->
	<filter>
	    <filter-name>encodingFilter</filter-name>
	    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	    <init-param>
	         <param-name>encoding</param-name>
	         <param-value>UTF-8</param-value>
	    </init-param>
	</filter>
	<filter-mapping>
	     <filter-name>encodingFilter</filter-name>
	     <url-pattern>/*</url-pattern>
	</filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
           

三、编写jsp页面

java web文件上传-spring web MVC

   upload.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>upload.jsp</title>
  </head>
  <body>
       <h2>文件上传功能演示</h2>
       <h2>${message}</h2>
       <c:url var="action" value="/upload/upload-action.form"/>
       <form action="${action}" method="post" enctype="multipart/form-data">
           <p>图片:<input type="file" name="image"/></p>
           <p>拍摄地点:<input type="text" name="location"/></p>
           <h3><input type="submit" value="上传图片"/></h3>
       </form>
  </body>
</html>
           

   success.jsp:上传成功提示页面

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>success.jsp</title>
  </head>
  <body>
     <h2>${pathName}</h2>
  </body>
</html>
           

四、编写后台上传代码:UploadController.java

package com.tarena.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import javax.naming.directory.DirContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartFile;

import com.sun.org.apache.bcel.internal.generic.NEW;

@Controller
@RequestMapping("/upload")
public class UploadController implements Serializable {
	  
	/**
	 * 显示上传文件页面
	 * @return
	 */
	@RequestMapping("/upload.form")
	public String uploadForm(){
		return "upload";
	}
	
	/**
	 * 处理上传文件请求
	 * @throws IOException 
	 */
	@RequestMapping("/upload-action.form")
	public String uploadAction(MultipartFile image,String location,ModelMap map,HttpServletRequest request) throws IOException{
		
		//获取图片原始文件名
		String name=image.getOriginalFilename();
	   //input输入框name属性值:image
		//String fieldName=image.getName();
		//org.springframework.web.multipart.MultipartFile
		
		//获取输入流,提交图片的数据内容(图片数据,大数据此种方式方便)
		//InputStream inputStream=image.getInputStream();
		
		//图片数据(小数据此种方式方便)
		byte[] bytes=image.getBytes();
		//图片的文件长度
		//long size=image.getSize();

		//存放路径
		String path=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
		File dir=new File(path);
		if(! dir.exists()){
			dir.mkdir();
		}
		File file=new File(dir,name);
		FileOutputStream out=new FileOutputStream(file);
		out.write(bytes);
		out.close();
		//file.getCanonicalPath():返回此抽象路径名的规范路径名字符串
		request.setAttribute("pathName","上传成功:"+file.getCanonicalPath()+"拍摄于:"+location);
		return "success";
	}
	
	
	/**
	 * 文件下载
	 * 现服务器项目目录下有该图片:暴风截图201491415793151.jpg
	 * 访问路径为;localhost:8080/SpringUpload/upload/get-file.form?name=暴风截图201491415793151.jpg 时,
	 * 将会下载看到图片
	 */
	@RequestMapping("/get-file.form")
	public void getImage(String name,HttpServletRequest request,HttpServletResponse response)throws IOException{
		//将name对应的图片读取回来,然后写入到response流中
		//name是下载的文件名
		if(name.endsWith(".png")){
			response.setContentType("image/png");
		}
		String path=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
		File file=new File(path,name);
		FileInputStream input=new FileInputStream(file);
		OutputStream output=response.getOutputStream();
		IOUtils.copy(input, output);
		input.close();
		output.close();
	}
	
	
	
	/**
	 * 处理控制器类上的异常
	 * @param request
	 * @param e
	 * @return
	 * @throws Exception
	 */
	@ExceptionHandler
	public String execute(HttpServletRequest request,Exception e) throws Exception{
		//处理IO异常
		if(e instanceof IOException){
			e.printStackTrace();
			request.setAttribute("message", "上传失败!");
			return "upload";
		}
		//处理文件上传超出限制大小时抛出的异常
		if(e instanceof MaxUploadSizeExceededException){
			e.printStackTrace();
			request.setAttribute("message", "文件过大!");
			return "upload";
		}
		throw e;
	}
}
           

五、在项目src目录下创建spring-mvc.xml文件,并进行配置,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd     
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">	
		
		
		<!-- 加上此配置,则可以省略HandlerMapping配置 -->
		<mvc:annotation-driven/>
		<!-- 开启组件扫描 -->
		<context:component-scan base-package="com.tarena"/>
		
		<!-- 视图解析器 -->
		<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		           <property name="prefix" value="/WEB-INF/jsp/"/>
		           <property name="suffix" value=".jsp"/>
		</bean>
		
	   <!-- 支持文件上传的Bean -->
	   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	          <!-- 限制文件上传的大小不超过100kb -->
<!-- 	          <property name="maxUploadSize" value="102400"/> -->
<!-- 	          <property name="resolveLazily" value="true"/> -->
	   </bean>		
</beans>
           

到了这里,包含文件上传和下载的demo也就完成了,经本人测试通过,在此就演示了,大家自己测吧。

整个代码下载地址:http://yunpan.cn/cQTKT9wiHKB7Q   访问密码 743c

继续阅读