Servlet的应用(三):文件下载

一:项目的框架


二:Web前端设计部分

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>downlod01页面</title>
</head>
<body>
<!-- 注意name后面最好不要有空格 不然在servlet页面读取数据的时候会把空格读进去 导致文件路径有问题-->
<a href="download01?name=b.ico">下载b站图标</a><br>
<a href="download01?name=car.jpg">下载奔驰图标</a>
</body>
</html>

                                                                                   效果如下:

                                                                             

注意: HTML 中 a标签与Servlet绑定的方式是通过href的值进行绑定的

                        form表单是通过action的值来进行绑定的


三:Servlet设计部分

package com.whx.servlet;

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;
import java.net.URLEncoder;

@WebServlet(value = "/download01", name = "DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
 //定义文件下载的目录的路径
    private String resourceLocation ="E:\\nginx\\nginx-1.17.2\\html\\";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取从html页面标注的name的信息
        String name = req.getParameter("name");

        //获取输入流
        FileInputStream is = new FileInputStream(resourceLocation + name);

        //处理中文文件下载的时候,浏览器显示中文的乱码问题
        String cnFileName = URLEncoder.encode(name, "utf-8");

        //下载需要设置头信息,这是一种固定的模式
        resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName);

        //获取输出流
        ServletOutputStream os = resp.getOutputStream();

        //在读入数据的时候,同时把数据输出到客户端的html上
        int length=0;
        byte[] bs =new byte[2048];

        while (-1 !=(length = is.read(bs))){
            os.write(bs,0,length);
        }

        os.flush();
        os.close();
        is.close();


    }
}


四:注意事项

(1)HTML:

                1.HTML中的a标签的href参数是用来绑定相关的servlet的,所以一定要和servlet中注解的值一样

                2. a标签中href中值的写法:

                        name的值会在servlet中被读取,和保存文件的目录拼起来构成下载的绝对路径

<a href="download01?name=b.ico">下载b站图标</a><br>
<a href="download01?name=car.jpg">下载奔驰图标</a>

(2)Servlet:

               1.在下载操作中,注解只需要一个,即:@WebServlet(参数) 而不需要@MutipartConfig

               2.与上传文件操作固定要先获取文件的头信息这一步骤相对应,在下载操作中,需要固定地先设置头信息,这也是一种固定的模式    

//下载需要设置头信息,这是一种固定的模式
        resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName);

               3.流的获取问题

在下载操作中,输出流的获取是通过resp来获取的:

//获取输出流
        ServletOutputStream os = resp.getOutputStream();

而在上传操作中,输入的获取是通过Part类对象来获取的:

// 利用part获取文件的输入流
        InputStream is = part.getInputStream();

                4.编码问题

如果下载的文件的文件名包含中文的话,有可能会出现编码问题,对此我们的解决方法是对文件名进行处理:

//处理中文文件下载的时候,浏览器显示中文的乱码问题
        String cnFileName = URLEncoder.encode(name, "utf-8");

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值