SpringMVC下载文件

来源:互联网 发布:网络英语热词如low 编辑:程序博客网 时间:2024/06/02 05:20

为了将像文件这样的资源发送到浏览器,需要在控制器中完成以下工作:
(1)对请求处理方法使用void返回类型,并在方法中添加HttpServletResponse参数。
(2)将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的body中定义数据的类型,并包含媒体类型和子类型标识符。
(3)添加一个名为Content-Disposition的HTTP响应标题,并赋值attachment; filename=fileName,这里的fileName是默认文件名,应该出现在File Download(文件下载)对话框中。它通常与文件同名,但是也并非一定如此。

ResourceController

@Controllerpublic class ResourceController {    private static final Log logger = LogFactory            .getLog(ResourceController.class);    @RequestMapping(value = "/login")    public String login(@ModelAttribute Login login, HttpSession session,            Model model) {        model.addAttribute("login", new Login());        if ("paul".equals(login.getUserName())                && "secret".equals(login.getPassword())) {            session.setAttribute("loggedIn", Boolean.TRUE);            return "Main";        } else {            return "LoginForm";        }    }    @RequestMapping(value = "/resource_download")    public String downloadResource(HttpSession session,            HttpServletRequest request, HttpServletResponse response) {        if (session == null || session.getAttribute("loggedIn") == null) {            return "LoginForm";        }        String dataDirectory = request.getServletContext().getRealPath(                "WEB-INF/data");        File file = new File(dataDirectory, "secret.pdf");        if (file.exists()) {            response.setContentType("application/pdf");            response.addHeader("Content-Disposition.pdf",                    "attachment;filename=secret.pdf");            byte[] buffer = new byte[1024];            FileInputStream fis = null;            BufferedInputStream bis = null;            try {                fis = new FileInputStream(file);                bis = new BufferedInputStream(fis);                OutputStream os = response.getOutputStream();                int i = bis.read(buffer);                while (i != -1) {                    os.write(buffer, 0, i);                    i = bis.read(buffer);                }            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            } finally {                if (bis != null) {                    try {                        bis.close();                    } catch (Exception e2) {                    }                }                if(fis!=null){                    try {                        fis.close();                    } catch (Exception e2) {                    }                }            }        }        return null;    }}

Login

public class Login  implements Serializable {    private static final long serialVersionUID = -38L;    private String userName;    private String password;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

LoginForm.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><html><head><title>Login</title></head><body><div id="global"><form:form commandName="login" action="login" method="post">     <fieldset>        <legend>Login</legend>        <p>            <label for="userName">User Name:</label>            <form:input id="userName" path="userName" cssErrorClass="error"/>        </p>        <p>          <label for="password">Password:</label>          <form:password id="password" path="password" cssErrorClass="error"/>        </p>        <p id="buttons">          <input id="reset" type="reset" tabindex="4">          <input id="submit" type="submit" tabindex="5" value="Login">        </p>           </fieldset></form:form></div></body></html>

Main.jsp

Main.jsp页面中包含了一个链接,用户可以单击它来下载文件。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html><head><title>Download Page</title><style type="text/css">@import url("<c:url value='/css/main.css'/>");</style></head><body>    <div id="global">        <h4>Please click the link below</h4>        <p>            <a href="resource_download">Download</a>        </p>    </div></body></html>

这里写图片描述
这里写图片描述
这里写图片描述

防止交叉引用

配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context.xsd    http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc.xsd        ">    <context:component-scan base-package="controller2" />    <mvc:annotation-driven />    <mvc:resources mapping="/css/**" location="/css/" />    <mvc:resources mapping="/*.html" location="/" />    <bean id="viewResolver"        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/jsp/" />        <property name="suffix" value=".jsp" />    </bean></beans>

imageController

@Controllerpublic class ImageController {    private static final Log logger = LogFactory.getLog(ImageController.class);    @RequestMapping(value = "/image_get/{id}", method = RequestMethod.GET)    public void getImage(@PathVariable String id, HttpServletRequest request,            HttpServletResponse response, @RequestHeader String referer) {        if (referer != null) {            String imageDirectory = request.getServletContext().getRealPath(                    "/WEB-INF/image");            File file = new File(imageDirectory, id + ".jpg");            if (file.exists()) {                response.setContentType("image/jpg");                byte[] buffer = new byte[1024];                FileInputStream fis = null;                BufferedInputStream bis = null;                try {                    fis = new FileInputStream(file);                    bis = new BufferedInputStream(fis);                    OutputStream os = response.getOutputStream();                    int i = bis.read(buffer);                    while (i != -1) {                        os.write(buffer, 0, i);                        i = bis.read(buffer);                    }                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } finally {                    if (bis != null) {                        try {                            bis.close();                        } catch (Exception e2) {                        }                    }                    if(fis!=null){                        try {                            fis.close();                        } catch (Exception e2) {                        }                    }                }            }        }    }}

images,html

<html><head><title>Photo</title></head><body><img src="image_get/1"/><img src="image_get/2"/><img src="image_get/3"/><img src="image_get/4"/><img src="image_get/5"/><img src="image_get/6"/><img src="image_get/7"/><img src="image_get/8"/><img src="image_get/9"/><img src="image_get/10"/></body></html>

这里写图片描述

原创粉丝点击