zoukankan      html  css  js  c++  java
  • 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;
        }
    }
        

      

  • 相关阅读:
    冰蝎,从入门到魔改
    红蓝对抗——加密Webshell“冰蝎”攻防
    DGA域名的今生前世:缘起、检测、与发展
    DNS隐藏隧道的使用
    DPI (Deep Packet Inspection) 深度包检测技术
    中国菜刀原理
    一句话木马和中国菜刀的结合拿webshell
    十大黑客工具之一——中国菜刀
    十大ATT&CK攻击技战术
    防守方新秘籍:MITRE 发布主动防御指导框架Shield
  • 原文地址:https://www.cnblogs.com/MrSaver/p/6524801.html
Copyright © 2011-2022 走看看