欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-02 13:56:27
...

一:项目的框架

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

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>

                                                                                   效果如下:

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

注意: 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();


    }
}

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


四:注意事项

(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");

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

 

 

 

 

 

 

 

相关标签: Servlet