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

  1. @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");
    }
  1. 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));
    }....
  2.  
  3. 重要的 processFileName方法。
  1. 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;
    }
  2.  
  3. //httpConverBytes 方法
  1. 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());
  2.  
  3. 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;
    }
  4.  
  5. 通过以上处理下划线问题解决了。
  1.  

springmvc文件下载之文件名下划线问题终极解决方案的更多相关文章

  1. 前端axios请求二进制数据流转换生成PDF文件空白问题(终极解决方案)

    本文章共1570字,预计阅读时间1 - 3分钟. 问题场景: axios请求二进制数据转换生成PDF空白问题,使用axios请求后端接口,后端返回的二进制流文件,需要转换成PDF,但是在postman ...

  2. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  3. SpringMVC文件下载与JSON格式

    点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...

  4. 关于springmvc下服务器文件打包成zip格式下载功能

    关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储   版权声明:本文为博主 ...

  5. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  6. springmvc上传文件,抄别人的

    SpringMVC中的文件上传 分类: SpringMVC 2012-05-17 12:55 26426人阅读 评论(13) 收藏 举报 stringuserinputclassencoding 这是 ...

  7. Eclipse不自动编译java文件的终极解决方案

    最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...

  8. 深入springMVC源码------文件上传源码解析(下篇)

    在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分 ...

  9. SpringMVC上传文件

    SpringMVC中上传文件还是比较方便的,Spring内置了一些上传文件的支持类,不需要复杂的操作即可上传文件. 文件上传需要两个jar支持,一个是commons-fileupload.jar和co ...

随机推荐

  1. oracle中事务处理--事务隔离级别

    概念:隔离级别定义了事务与事务之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而以,不同的数据库在实现时有所不同). 隔离级别 脏读 ...

  2. Java学习日记——基本数据类型

    基本数据类型: byte 1个字节 正负都能表示2的8-1次方 -128~127(包括0) short 2个字节 2的16-1次 整数类型 (默认为int类型) int 4个字节 2的32-1次方 l ...

  3. 借鉴别人的Oracle 11g安装和卸载图文教程

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...

  4. 使用IDEA配置Maven + SpringMVC + Mybatis 【一步一步踩坑详细配置完成】

    PS:初学,想使用Maven配置一个SpringMVC的开发环境,照着网上的各种图文解说,配置了好久都没成功,有些写的不够详细,有些只有写一半,走了不少弯弯绕绕,踩了不少的坑,此文将正确配置成功的步骤 ...

  5. Bate敏捷冲刺每日报告--day3

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  6. Python实现网站模拟登陆

    一.实验简介 1.1 基本介绍 本实验中我们将通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方 ...

  7. Django 基本设置

    建立django目录,为了独立区分app和主站的关系,需要把app完全和主站分离 app/views.py from django.shortcuts import render from djang ...

  8. eclipse下maven一些配置方法汇总

    随着eclipse的不同版本的变更:对maven插件的安装也有着不同的差异:之前也在一些版本的eclipse上安装成功地,但是最近又遇到了一些麻烦,故将这些方法记录下来: 大家都知道的最常用的一种方式 ...

  9. 成功案例分享:raid5两块硬盘掉线数据丢失恢复方法

    1. 故障描述    本案例是HP P2000的存储vmware exsi虚拟化平台,由RAID-5由10块lT硬盘组成,其中6号盘是热备盘,由于故障导致RAID-5磁盘阵列的两块盘掉线,表现为两块硬 ...

  10. 格式化输出io:format的奇技淫巧

    格式化输出io:format是我接触Erlang使用的第一个库函数(io:format("Hello World")),随着学习的深入,它也是我debug优先选择最简单直接的工具. ...