JavaWeb如何实现资源下载功能

一、概述

1、下载是什么?
下载其实就是向客户端响应字节数据。
把一个文件变成字节数组,然后使用response.getOutputStream()响应给浏览器。
2、下载的要求:
下载的要求其实可以简要概括成六个字:“两个头一个流 ”。

两个头:分别为Content-Type和Content-Disposition。
Content-Type表示的是你传递给客户端的文件的MIME类型,例如:image/pjpeg。可以通过文件名称调用ServletContext.getMimeType()方法,得到MIME类型。
Content-Disposition的默认值为inline,表示在浏览器窗口中打开。我们要给的值是如下这种格式:attachment;filename=xxx 。在filename=后面跟随的是显示在下载框中的文件名称。
一个流:就是要下载的文件数据。我们自己new一个输入流即可

二、文件下载实例一:

1、在web建一个img包用来放下载内容:

2、在web建一个download.jsp文件

<html>
<head>
    <title>下载</title>
</head>
<body>
    <img src="img/108.jpg" width="350px" height="180px"><br>
    <a href="DownloadController">下载</a>
</body>
</html>

 3、我们新建一个项目,并且创建一个DownloadController:

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.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/DownloadController")
public class DownloadController extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得资源绝对路径
        String realPath = this.getServletContext().getRealPath("img"+ File.separator + "108.jpg");
        // 告诉浏览器进行下载处理!而不是在线打开
        resp.setHeader("content-disposition","attachment;filename=108.jpg");
        //将读取到的资源写给浏览器
        FileInputStream in = new FileInputStream(realPath);
        ServletOutputStream out = resp.getOutputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len=in.read(b))!=-1){
            out.write(b,0,len);
        }
        //关闭流
        out.close();
        in.close();
    }
}

4、运行效果

三、文件下载实例二:

如果图片名字是中文他会出现问题,大部分浏览器,使用的都是URL编码。我们要转码

 resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));

1、在原来的download.jsp文件中修改

<html>
<head>
    <title>下载</title>
</head>
<body>
    <img src="img/108.jpg" width="350px" height="180px"><br>
    <!--<a href="DownloadController">下载</a>!-->
    <a href="DownloadController?resourcename=img/108.jpg">下载</a><br>
    <img src="img/黄昏.jpg" width="350px" height="180px"><br>
    <a href="DownloadController?resourcename=img/黄昏.jpg">下载</a><br>
    <img src="img/140.png" width="30px" height="30px"><br>
    <a href="DownloadController?resourcename=img/UCll.rar">下载</a>
</body>
</html>

2、在实例一3里面加

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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet("/DownloadController")
public class DownloadController extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //接收资源的名字,
        String resourcename = req.getParameter("resourcename");
        //获得资源绝对路径
        //String realPath = this.getServletContext().getRealPath("img"+ File.separator + "108.jpg");
        String realPath = this.getServletContext().getRealPath(resourcename);
        System.out.print(realPath);
        //截取文件名
        int i = realPath.lastIndexOf(File.separator);
        System.out.print(i);
        String filename = realPath.substring(i + 1);
        System.out.print(filename);
        // 告诉浏览器进行下载处理!而不是在线打开
        resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
        //inline在线打开
        //resp.setHeader("content-disposition","attachment;filename=108.jpg");
        //将读取到的资源写给浏览器
        FileInputStream in = new FileInputStream(realPath);
        ServletOutputStream out = resp.getOutputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len=in.read(b))!=-1){
            out.write(b,0,len);
        }
        out.close();
        in.close();
    }
}

3、运行效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaWeb“系统管理”项目资源概览 一、内容概览 这个JavaWeb“系统管理”项目资源包,是专为对JavaWeb开发有兴趣的学习者设计的。它包含了从基础到高级的完整知识体系,以及实际项目操作的全部流程。具体内容包括: 项目背景与目标:详细介绍了“系统管理”项目的起源、目的和核心功能。 技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流JavaWeb框架的使用,以及MySQL数据库的管理。 项目模块解析:按照实际项目结构,分模块介绍了后台管理、用户权限管理、数据报表生成等功能的具体实现。 代码与实现细节:提供了完整的项目源代码,并针对关键部分进行了详细的注释和解析。 文档与笔记:整理了开发过程中的关键决策、技术难题以及学习心得,有助于深入理解项目背后的思考过程。 二、适用人群 这个项目资源包适用于即将毕业或已经毕业,希望通过实际项目经验增强自己JavaWeb开发能力的同学。无论你是初学者还是有一定经验的开发者,都可以从中获得宝贵的实践经验和技能提升。 三、使用建议 理论与实践相结合:在学习过程中,不仅要关注代码实现,更要理解背后的设计思想和原理。 模块化学习:建议按照项目模块进行学习,从基础到高级,逐步深入。 持续实践与反思:通过实JavaWeb“系统管理”项目资源概览 一、内容概览 这个JavaWeb“系统管理”项目资源包,是专为对JavaWeb开发有兴趣的学习者设计的。它包含了从基础到高级的完整知识体系,以及实际项目操作的全部流程。具体内容包括: 项目背景与目标:详细介绍了“系统管理”项目的起源、目的和核心功能。 技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流JavaWeb框架的使用,以及MySQL数据库的管理。 项目模块解析:按照实际项目结构,分模块介绍了后台管理、用户权限管理、数据报表生成等功能的具体实现。 代码与实现细节:提供了完整的项目源代码,并针对关键部分进行了详细的注释和解析。 文档与笔记:整理了开发过程中的关键决策、技术难题以及学习心得,有助于深入理解项目背后的思考过程。 二、适用人群 这个项目资源包适用于即将毕业或已经毕业,希望通过实际项目经验增强自己JavaWeb开发能力的同学。无论你是初学者还是有一定经验的开发者,都可以从中获得宝贵的实践经验和技能提升。 三、使用建议 理论与实践相结合:在学习过程中,不仅要关注代码实现,更要理解背后的设计思想和原理。 模块化学习:建议按照项目模块进行学习,从基础到高级,逐步深入。 持续实践与反思:通过实JavaWeb“系统管理”项目资源概览 一、内容概览 这个JavaWeb“系统管理”项目资源包,是专为对JavaWeb开发有兴趣的学习者设计的。它包含了从基础到高级的完整知识体系,以及实际项目操作的全部流程。具体内容包括: 项目背景与目标:详细介绍了“系统管理”项目的起源、目的和核心功能。 技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流JavaWeb框架的使用,以及MySQL数据库的管理。 项目模块解析:按照实际项目结构,分模块介绍了后台管理、用户权限管理、数据报表生成等功能的具体实现。 代码与实现细节:提供了完整的项目源代码,并针对关键部分进行了详细的注释和解析。 文档与笔记:整理了开发过程中的关键决策、技术难题以及学习心得,有助于深入理解项目背后的思考过程。 二、适用人群 这个项目资源包适用于即将毕业或已经毕业,希望通过实际项目经验增强自己JavaWeb开发能力的同学。无论你是初学者还是有一定经验的开发者,都可以从中获得宝贵的实践经验和技能提升。 三、使用建议 理论与实践相结合:在学习过程中,不仅要关注代码实现,更要理解背后的设计思想和原理。 模块化学习:建议按照项目模块进行学习,从基础到高级,逐步深入。 持续实践与反思:通过实际操作项目,不断反思和总结,形成自己的技术见解和经验。 参与社区讨论:与同行交流心得,共同成长,拓宽视野。际操作项目,不断反思和总结,形成自己的技术见解和经验。 参与社区讨论:与同行交流心得,共同成长,拓宽视野。际操作项目,不断反思和总结,形成自己的技术见解和经验。 参与社区讨论:与同行交流心得,共同成长,拓宽视野。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值