关于下载中文名称文件浏览器显示500

DownServlet

public class DownServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// request.setCharacterEncoding("utf-8");
// response.setContentType("text/html;charset=utf-8");

    System.out.println("已经收到要下载的文件名称啦。。。。");

    // 1 获取客户端请求下载的文件名称.
    String filename = request.getParameter("filename");

    // 解决GET方式请求的参数中文乱码问题:
    filename = new String(filename.getBytes("ISO-8859-1"), "utf-8");

    // 2 通过文件名称,查询数据表.
    QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    String sql = "SELECT * FROM filesave WHERE filename=?";
    try {
        FileSave filesave = runner.query(sql, new BeanHandler<FileSave>(FileSave.class), filename);

        // 3 通过查询到的保存路径,读取具体文件.
        InputStream in = new FileInputStream(new File(filesave.getSavepath()));

        // 4 获取服务器端的响应输出流
        OutputStream out = response.getOutputStream();

        // 获取客户端请求头中的User-Agent
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else {
            // 其他浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        }

        /*
         * 通知浏览器:文件是需要下载的,而不是显示的. * 为下载设置ContentType和Content-Disposition
         */
        response.setContentType(getServletContext().getMimeType(filename));
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);

        // 5 利用IOUtils工具类的copy()方法
        IOUtils.copy(in, out);

        // 6 释放资源
        in.close();

// out.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    doGet(request, response);
}

}


download.jsp

a href="${pageContext.request.contextPath }/servlet/DownServlet?filename=黑臀.jpg">黑臀.jpg
a href="${pageContext.request.contextPath }/servlet/DownServlet?filename=哈哈.xls">2.xls
a href="${pageContext.request.contextPath }/servlet/DownServlet?filename=3.html">3.html

a href="${pageContext.request.contextPath }/servlet/DownServlet?filename=4.txt">4.txt


3个回答

jsp页面主要代码就是这样的

// 3 通过查询到的保存路径,读取具体文件.
InputStream in = new FileInputStream(new File(filesave.getSavepath()));
当我选择下载带中文名称文件时这条代码报空指针异常

多半是filesave是null,楼主断点跟到这一行看啊

baokx
一缕清风007 回复俗人爱酒: ide是用的eclipse还是idea?
2 年多之前 回复
poet_LoveWine
Leslie_96 怎么断点查看啊。。。没头脑,不过估计就是这个问题了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问