Leslie_96 2017-11-07 02:55 采纳率: 50%
浏览 1107

关于下载中文名称文件浏览器显示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条回答

  • Leslie_96 2017-11-07 02:59
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?