之前我们介绍了在无框架支持的环境下如何进行文件上传的方式,此种方式比较基础,相对而言比较麻烦一点。
在接下来的文章中,我们将借助spring web mvc框架简化文件上传的操作。
一、创建web项目,导入spring web mvc支持包以及上传文件jar包
到了这里,包含文件上传和下载的demo也就完成了,经本人测试通过,在此就演示了,大家自己测吧。
在接下来的文章中,我们将借助spring web mvc框架简化文件上传的操作。
一、创建web项目,导入spring web mvc支持包以及上传文件jar包
二、在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页面
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