Servlet+LayUI实现文件下载

本文介绍了如何使用Java Servlet和JavaScript配合,通过FileDownloadUtil类实现文件的下载功能。同时展示了如何在前端表格中添加下载链接,点击后触发下载请求。重点在于处理中文文件名和URL编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接上代码

package servlets;


import utils.FileDownloadUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FileDownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        request.setCharacterEncoding("utf-8");

        String filename = request.getParameter("filename");
        String savename = request.getParameter("savename");

        FileDownloadUtil fileDownloadUtil =new FileDownloadUtil();

        fileDownloadUtil.downloadFile(response,savename,filename);

    }

}

    public static void downloadFile(HttpServletResponse response, String saveName, String showFileName) {

        BufferedInputStream bis = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedOutputStream bos = null;
        try {
            String path = "D:\\source\\file\\" + saveName;
            File file=new File(path); //:文件的声明
            String fileName=file.getName();
            is = new FileInputStream(file);  //:文件流的声明
            os = response.getOutputStream();
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(os);

            fileName = java.net.URLEncoder.encode(showFileName, "UTF-8");// 处理中文文件名的问题
            fileName = new String(fileName.getBytes("UTF-8"), "GBK");// 处理中文文件名的问题
            fileName= fileName.replaceAll("\\+","%20");    //处理空格转为加号的问题

            response.reset();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/x-msdownload");

            response.setHeader("Content-Disposition", "attachment; filename="+fileName);
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = bis.read(buffer)) != -1){
                bos.write(buffer, 0, bytesRead);
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex.getMessage());
        } finally {

            try {
                if (null != bis) {
                    bis.close();
                    bis = null;
                }
                if (null != bos) {
                    bos.close();
                    bos = null;
                }
                if (null != is) {
                    is.close();
                    is = null;
                }
                if (null != os) {
                    os.close();
                    os = null;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex.getMessage());
            }
        }
    }

function getSignFileTable(params) {
    layui.use(['table', 'laypage'], function () {

        //生成表格
        var table = layui.table;
        table.render({
            elem: '#sign_file_table'
            , type: "post"
            , where: params
            , url: "GetSignTableInfoServlet"
            , parseData: function (res) {
                var data = JSON.parse(res.data);
                return {
                    "code": res.code,
                    "msg": res.msg,
                    "count": data.all,
                    "data": data.beanList
                }
            }
            , cols: [[{
                field: 'id',
                title: '序号',
                type: 'numbers'
            }, {
                field: 'fileName',
                title: '文件名称'
            }, {
                field: 'saveName',
                title: '文件名称',
                hide: true
            }, {
                fixed: 'right',
                title: '操作',
                toolbar: '#barDemo'
            }]]
            // , page: true
            , even: true

        });

        //监听工具条
        table.on('tool(sign_file_table)', function (obj) {

            var data = obj.data;
            var layEvent = obj.event;

            if (layEvent === 'download') {
                window.location.href = "/FileDownloadServlet?filename=" + data.fileName + "&savename=" + data.saveName;
                /*$.ajax({
                    url: "FileDownloadServlet",
                    type: 'get',
                    data: {
                        "filename": data.fileName,
                        "savename": data.saveName
                    },


                });*/

            } else if (layEvent === 'delete') {

                $.ajax({
                    url: "DeleteSignFileServlet",
                    type: 'POST',
                    data: {
                        // "filename": data.fileName,
                        "savename": data.saveName
                    },

                });

                table.render({
                    elem: '#sign_file_table'
                    , type: "post"
                    , where: params
                    , url: "GetSignTableInfoServlet"
                    , parseData: function (res) {
                        var data = JSON.parse(res.data);
                        return {
                            "code": res.code,
                            "msg": res.msg,
                            "count": data.all,
                            "data": data.beanList
                        }
                    }
                    , cols: [[{
                        field: 'id',
                        title: '序号',
                        type: 'numbers'
                    }, {
                        field: 'fileName',
                        title: '文件名称'
                    }, {
                        field: 'saveName',
                        title: '文件名称',
                        hide: true
                    }, {
                        fixed: 'right',
                        title: '操作',
                        toolbar: '#barDemo'
                    }]]
                    // , page: true
                    , even: true

                });

            }
        });


    });
}

JS代码仅作参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值