Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 355|回复: 0

springmvc文件下载之文件名下划线问题终极解决方案

[复制链接]
  • TA的每日心情
    奋斗
    前天 11:25
  • 签到天数: 792 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    723136
    发表于 2021-6-26 16:23:24 | 显示全部楼层 |阅读模式

    直接上代码:Action中代码片段。

    @RequestMapping("download")
    public String download(ModelMap model, @ModelAttribute("e") Template t, HttpServletResponse response, HttpServletRequest request) throws Exception {
    Account acc = getLoginAccount();   
    if(acc==null || StringUtils.isBlank(acc.getAccount())){
    return ("/account/login");
    }
    String fileUrl = template.getFileUrl();   //url 路径, 如 http://×××××/×××/××××/image/20170525/中文.jpg
    String filename = fileUrl.substring(fileUrl.lastIndexOf("/")+1);  //截取最后的文件名  -> 中文.jpg
    filename = processFileName( request, filename);
    BufferedOutputStream bf = null;
    try {
    response.setHeader("Content-disposition", "attachment; filename = " + filename);
    bf = new BufferedOutputStream(response.getOutputStream());
    bf.write(this.httpConverBytes(fileUrl,request));
    }....


    重要的 processFileName方法。
    public static String processFileName(HttpServletRequest request, String fileNames) {
    String codedfilename = null;
    try {
    String agent = request.getHeader("USER-AGENT");
    if (null != agent && -1 != agent.indexOf("MSIE") || null != agent
    && -1 != agent.indexOf("Trident")) {// ie
    String name = java.net.URLEncoder.encode(fileNames, "UTF8");
    codedfilename = name;
    } else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
    codedfilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return codedfilename;
    }

    //httpConverBytes 方法
    public static byte[] httpConverBytes(String path,HttpServletRequest request) {
    BufferedInputStream in = null;
    ByteArrayOutputStream out = null;
    URLConnection conn = null;
    int httpResult=0;
    try {
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<path.length();i++){
    char a=path.charAt(i);   //url路径的中文部分重新编码 很重要
    if(a>127){//将中文UTF-8编码
    sb.append(URLEncoder.encode(String.valueOf(a), "utf-8"));
    }else{
    sb.append(String.valueOf(a));
    }
    }
    URL url = new URL(sb.toString()); //创建URL
    URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码urlconn.connect();
    HttpURLConnection httpconn = (HttpURLConnection) urlconn;
    httpResult = httpconn.getResponseCode();
    in = new BufferedInputStream(httpconn.getInputStream());

    if (httpResult != HttpURLConnection.HTTP_OK){ //不等于HTTP_OK说明连接不成功
    System.out.print("连接失败!");
    }else {
    out = new ByteArrayOutputStream(1024);
    byte[] temp = new byte[1024];
    int size = 0;
    while ((size = in.read(temp)) != -1) {
    out.write(temp, 0, size);
    }
    byte[] content = out.toByteArray();
    return content;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    finally {
    try {
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    try {
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return null;
    }


    通过以上处理下划线问题解决了。

     

     
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-16 13:04 , Processed in 0.061161 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表