SpringMVC:学习笔记(9)——文件下载

SpringMVC—文件下载

说明

两个案例

  1.为登录用户提供下载服务。

  2.阻止仅通过输入网址即可获取下载。

文件下载概览

  为了将文件发送给浏览器,我们需要在控制器中完成以下操作:

  1. 对请求处理方法使用void返回类型,并且在方法中添加HttpServletResponse参数。
  2. 将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的body中定义数据的类型,并包含媒体类型和子类型标识符。如果不清楚内容类型,并且希望浏览器失始终显示保存对话框,则将它设为APPLICATION/OCTET-STREAM。这个值时不区分大小写的。
  3. 添加一个名为Content-Disposition的HTTP响应标题,并赋值attachment;filename=fileName,这里的fileName是默认的文件名。

案例1:为登录用户提供下载服务

Domain类

package domain;
public class Login {
    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;
    }
}

Controller控制器

package controller;

import domain.Login;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;

@Controller
public 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("ms".equals(login.getUsername())&&"123".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,"Blog.zip");
        if(file.exists())
        {
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition","attachment;filename=Blog.zip");
            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 (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return null;
    }
}

编写视图

Main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>DownPage</title>
</head>
<body>
    <h4>点击链接下载文件</h4>
    <p>
        <a href="resource_download" >Down</a>
    </p>
</body>
</html>

LoginForm.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
    <form:form commandName="login" action="login" method="post">
        账号: <br>
        <form:input path="username" cssErrorClass="error" id="username"/>
        <br> 密码: <br>
        <form:input path="password" cssErrorClass="error" id="password"/>
        <br> <input type="submit" value="提交">
    </form:form>
</body>
</html>

案例2:阻止仅通过输入网址即可获取下载

    @RequestMapping(value = "/resource_download")
    public String downloadResource(HttpSession session, HttpServletRequest request, HttpServletResponse response,@RequestHeader String refuer
    ){
        if(refer==null) //通过判断refer来浏览器输入网址就能下载图片的情况
        {
          return "LoginForm";
        }
        String dataDirectory = request.getServletContext().getRealPath("/WEB-INF/data");
        File file = new File(dataDirectory,"Blog.zip");
        if(file.exists())
        {
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition","attachment;filename=Blog.zip");
            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 (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return null;
    }
}
    

  

原文地址:https://www.cnblogs.com/MrSaver/p/6524801.html