写给大忙人看的Servlet 文件下载

6 篇文章 0 订阅
2 篇文章 0 订阅

案例:

文件下载需求:

一:页面显示超链接

二:点击超链接后弹出下载提示框

三:完成图片文件下载

分析:

一:超链接指向的资源如果能够浏览器解析,则在浏览器中显示,如果不能解析,则弹出下载提示框,不满足需求

二:任何资源都必须弹出下载提示框

三:使用响应头设置资源的打开方式

content-disposition:attachment;filename=xxx

步骤:

一:定义页面,编辑超链接href属性,指向servlet,传递资源名称filename

二:定义Servlet

	一:获取文件名称

   二:使用字节输入流加载文件进内存

   三:指定response响应头:context-disposition:attachment;filename=xxx

   四:将数据写出到response输出流

问题:

中文文件问题

解决思路:

一:获取客户端使用的浏览器版本信息

二:根据不同的版本信息,设置filename的编码方式不同

实现结果如图:
在这里插入图片描述
在这里插入图片描述

项目准备

一:使用maven管理jar包,添加依赖

 <!--javaEE-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--jstl依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

二:前端页面代码:

<%--
  Created by IntelliJ IDEA.
  User: Lenovo
  Date: 2020/3/3
  Time: 18:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>下载文件</title>
    <style>
        a{
            text-decoration: none;
        }
    </style>
</head>
<body>


<a href="/download?filename=亚远.png">下载图片</a>
<hr/>
<a href="/download?filename=a.avi">下载视频</a>
</body>
</html>

三:servlet代码实现问件下载:

package com.servlet01.servlet;


import com.servlet01.util.DownLoadUtil;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * package_name:com.servlet01.servlet
 *
 * @author:徐亚远 Date:2020/3/3 18:18
 * 项目名:servlet-project
 * Description:TODO
 * Version: 1.0
 **/
@WebServlet("/download")
public class DownLoad extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一:获取请求参数,文件名称
        String filename = req.getParameter("filename");
        //二:使用字节输入流加载文件进内存
        //2.1获取文件真实路径
        ServletContext context = req.getServletContext();
        String path = context.getRealPath("/WEB-INF/image/" + filename);
        System.out.println("path:" + path);
        //2.2用字节流关联
        FileInputStream inputStream = new FileInputStream(path);

        //3指定response响应头:content-disposition:attachment;filename=xxx
        //3.1设置响应头类型  content-type
        //获取mimeleix
        String mimeType = context.getMimeType(filename);
        resp.setHeader("content-type", mimeType);
        //设置响应头打开方式
        //解决中文文件名问题
        //1:获取user-agent请求头
        String agent = req.getHeader("user-agent");
        //2:使用工具类方法编码文件名即可
        filename = DownLoadUtil.getFileName(agent, filename);

        resp.setHeader("content-disposition", "attachment;filename=" + filename);

        //4将输入流的数据写出到输出流中
        ServletOutputStream sos = resp.getOutputStream();
        byte[] buff = new byte[1024 * 10];
        int len = 0;
        while ((len = inputStream.read(buff)) != -1) {
            sos.write(buff, 0, len);
        }
    }
}

工具类:

package com.servlet01.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * package_name:com.servlet01.util
 *
 * @author:徐亚远 Date:2020/3/3 19:19
 * 项目名:servlet-project
 * Description:TODO
 * Version: 1.0
 **/

public class DownLoadUtil {

    public static String getFileName(String agent,String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")){
            //IE浏览器
            filename = URLEncoder.encode(filename,"utf-8" );
            filename = filename.replace("+"," " );
        }else if (agent.contains("Firefox")){
            //火狐浏览器
           BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B"+base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
        }else {
            //其他浏览器
            filename = URLEncoder.encode(filename,"utf-8" );
        }

        return filename;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java核心技术是计算机科学领域中最重要的编程语言之一,广泛应用于软件开发、云计算和大数据处理等领域。为了方便大忙人下载学习,以下是关于Java核心技术的一些下载建议。 首先,您可以在Oracle官方网站上获取Java开发工具包(JDK)。JDK提供了编译和运行Java程序所需的各种工具和库文件。您可以根据您的操作系统版本选择合适的JDK版本进行下载。下载完成后,按照安装向导进行安装即可。 其次,您可以在Java官方网站上找到Java编程语言规范的文档。这些规范描述了Java语言的语法、语义和特性,是学习Java编程的基础。您可以选择下载最新版本的Java语言规范,并阅读文档以便更好地理解Java编程语言的使用和设计原则。 此外,Java核心技术维护者还提供了丰富的教程和示例代码,以帮助程序员更好地学习和应用Java。您可以在Java官方网站上找到官方发布的教程和手册,这些资源涵盖了Java核心技术的各个方面,包括面向对象编程、多线程、异常处理和网络编程等。同时,您还可以在开源社区中找到大量的Java教程和示例代码,如GitHub等,这些资源通常由开发者们共享,能够帮助您更深入地学习和理解Java核心技术的实际应用。 最后,您可以考虑加入Java技术社区和论坛,与其他Java开发者进行交流和分享。这些社区和论坛通常提供了丰富的学习资源和讨论区,您可以在这里提问、解答问题,并与其他人共同探讨Java核心技术的应用和发展趋势。 总之,通过以上的下载和学习建议,您将能够更轻松地获取和学习Java核心技术。希望这些信息对您有所帮助,祝您在学习和应用Java核心技术的过程中取得成功! ### 回答2: 亲爱的大忙人, 首先,让我向您致以诚挚的问候。我知道您很忙,但我相信对您来说,学习Java核心技术是非常重要的。因此,请允许我为您提供一些下载Java核心技术的途径。 首先,您可以前往Oracle官方网站,他们提供了最新版本的Java Development Kit(JDK)下载。JDK是编写和运行Java程序所必需的软件包。您可以在Oracle官方网站上找到针对不同操作系统和版本的JDK下载链接。 另外,您还可以加入Java开发者社区,例如GitHub或Stack Overflow。这些社区为Java开发者提供了大量的学习资源和交流平台。您可以在这些社区上查找和下载Java核心技术的代码示例、项目实例和经验分享。 此外,还有一些在线教育平台,如Coursera、Udemy和MOOC等,这些平台提供Java核心技术的线上课程。您可以通过这些课程系统性地学习Java的核心知识,并在实践中提升自己的技能。 最后,我建议您购买一本权威的Java核心技术教材,如《Java核心技术 卷一:基础知识》。这本书由Horstmann和Cay S. Horstmann编写,被广泛认可为Java技术的权威指南。 尊敬的大忙人,请一定要为自己的学习留出时间。学习Java核心技术将为您的职业生涯带来巨大的价值和机会。如果您有任何疑问或需要更多帮助,请随时与我联系。 祝您学习顺利,事业腾飞! 此致 敬礼 ### 回答3: Java核心技术是指在Java编程语言中必须具备的基本技术,是Java程序开发的基石。对于大忙人来说,以下是关于Java核心技术下载的说明: 首先,您可以通过访问Oracle官方网站来下载Java核心技术的最新版本。在官方网站上,您可以找到Java Development Kit(JDK),它包括了编译器、调试器和其他开发工具。您可以选择适合您操作系统的版本进行下载和安装。 此外,您还可以通过其他第三方的合法渠道来获取Java核心技术的学习资料和相关书籍。这些资料可以帮助您理解Java编程语言的基本原理和核心概念,并提供实例和案例来帮助您更好地掌握技术。 另外,如果您有时间,您也可以考虑参加Java编程的培训课程。培训机构通常会提供有关Java核心技术的详细教学内容以及实践项目,有助于您更加系统地学习和掌握Java编程技术。 最后,如果您想了解关于Java核心技术的最新动态和技术分享,您可以通过参加Java开发者社区的线上或线下活动来获取信息。这些社区经常组织技术讲座、研讨会和交流活动,提供了与其他Java开发者互动和分享经验的机会。 总之,要下载并学习Java核心技术,您可以从官方网站、第三方资源、培训课程和开发者社区等多个途径获取相关的学习资料和交流机会。通过合理规划和利用碎片时间,您可以逐步掌握Java核心技术,并在实际项目中应用和提升您的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值