Javaweb的文件下载

本文探讨了在Java Web开发中遇到的文件下载问题,尤其是涉及中文文件名时的500错误。通过实例展示如何正确处理文件路径、编码和响应头,以确保文件下载成功且中文字符无乱码。同时,对比了直接写入文件名的处理方式和问题解决方法。

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

文件下载

文件下载通常以流的形式上传。

download.jsp文件下载界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<a href="<%=request.getContextPath()%>/download?file=cpt.png">下载</a>
</body>
</html>

FileDownloadServlet

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //客户端获取需要下载的文件
        String file= req.getParameter("file");
        System.out.println(file);
        //获取文件在我们项目中的路径,发布到tomcat的实际路径
        String path=req.getServletContext().getRealPath("/file/"+file);
        System.out.println(path);

        FileInputStream fileInputStream=new FileInputStream(path);

        resp.setCharacterEncoding("UTF-8");

        //指明响应的配置信息,包含附件
        resp.setHeader("Content-Disposition","attachment;filename="+file);
        //如果文件名不包含中文可以不设置该项
        //如果包含中文名,则需要设置编码,否则文件名下载后中文字符会乱码
        //getBytes指定了编码的方式,ISO-8859-1指定了解码(读取)的方式,想要转换编码,就是先编码,再解码
        //resp.setHeader("Content-Disposition","attachment;filename="+new String(file.getBytes("gb2312"),"iso-8859-1"));

        ServletOutputStream servletOutputStream=resp.getOutputStream();

        byte[] buf=new byte[1024];
        int len;
        while((len=fileInputStream.read(buf))!=-1){
            servletOutputStream.write(buf,0,len);
        }
        servletOutputStream.close();
    }
}

截图:
在这里插入图片描述

注意:(该问题如有解决方法欢迎留言交流相互学习)

1.提交要下载的文件包含中文名的会出现500错误;
在这里插入图片描述

1.1错误内容:
在这里插入图片描述
1.2代码:
在这里插入图片描述

1.3控制台输出:
在这里插入图片描述

2.直接在代码里面写入文件名:(文件正常下载,下载的文件也不会出现乱码的情况)
2.1代码:
在这里插入图片描述
2.2控制台输出:
在这里插入图片描述

2.3效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值