最近使用springboot项目,一直以来文件都以英文格式存储,这次使用的是xls文件下载,文件名为中文的,特此记录下中文文件名的下载以及springboot中下载路径报错问题。

正文

在使用springboot导出excel的时候,出现了两个问题:如下

1. 导出的时候中文名乱码问题

如:鑱旂綉鍗煎叆妯℃澘.xlsx

2. 导出的时候springboot路径问题:在jar项目后会默认多一个!,导致路径错误。

具体实现思路是:

首先拿到文件名,然后拿到父路径和文件名,创建一个File,然后将此file使用response写出到客户端。对于获取父路径:使用的是类的加载器,getResource(“name”)得到的URL对象,然后获取的url.getPath(),这就造成了获取File时候创建的路径多了个!。

之后进行更改,因为获取File文件之后还是需要拿到InputStream。所以这里直接使用的是:类的加载器直接获取资源作为InputStream

接下来就是解决乱码问题:

名字进行重新编码:

然后设置一些相应类型和响应头:将流作为相应

完整版代码如下:

 String file_name = "用户导入模板.xlsx";
try{
OutputStream os = response.getOutputStream();
String fileName = new String(file_name.getBytes("GBK"),"ISO-8859-1");
InputStream is = this.getClass().getClassLoader().getResourceAsStream("excelTemplate/" + file_name);
response.setContentType("application/force-download");
response.addHeader("Content-Disposition","attachment;fileName=" + fileName);
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}

这样就可以下载文件了并且不会出现乱码。

目前还没有遇到别的问题,有别的问题在更新。

2018-08-27更新:

在最近使用下载的时候,发现转来转去的编码比较麻烦,发现了一个 URLEncoder.encode(fileName,"UTF-8") 的方法,特此记录下。

 String fileName = path.substring(path.lastIndexOf("\\") +1 ,path.length());
File file = new File(path);
if (!file.exists()){
logger.error("路径有误,文件不存在!");
}
//new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
response.setContentType("content-type:octet-stream");
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0 ;
while ((len = inputStream.read(buffer)) != -1){
outputStream.write(buffer ,0 , len);
}
inputStream.close();
outputStream.close();

使用 URLEncoder.encode(fileName,"UTF-8"),将编码转换为utf-8编码。

springboot项目中文件的下载(解决中文乱码问题)的更多相关文章

  1. java 读取文件到String(解决中文乱码)

    在改写V&View(维视)时用到了文件管理,需要从html文档读取字符串,可是一直出现中文乱码,一直解决不了.而且很是意外,我在本地运行代码时就能正常读取中文,当放到tomcat上时全是乱码, ...

  2. php下载解决中文乱码问题

    利用 iconv() 函数解决乱码 $file_name = iconv("utf-8","gb2312",$file_name); 具体下载代码如下: pub ...

  3. MySQL直接导出CSV文件,并解决中文乱码的问题

    需求: 需要导出hr_users 表中的部分字段的数据,以前是用PHP写脚本,然后导出CSV文件. 在MySQL中,它自己就能导出CSV文件 ,只不过是有如下几个问题需要大家解决. 1. 生成文件不成 ...

  4. Java读写.properties文件实例,解决中文乱码问题

    package com.lxk.propertyFileTest; import java.io.*; import java.util.Properties; /** * 读写properties文 ...

  5. 在visual studio code 中配置python以及解决中文乱码问题

    安装好 visual stuido code (下面简称 “ VSC ”)后,要想使用它运行调试 python 代码还需要做一些工作以解决下列问题: 搭建 python 环境 print 打印中文出现 ...

  6. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    ;//一次读取的字节长度 File fin = new File("D:\\test\\20160622_627975.txt");//读取的文件 File fout = new  ...

  7. Flex上传文件Java端解决中文乱码问题

    1.Flex端进行编码 public function encodeStr(str:String, charSet:String):String { var result:String =" ...

  8. Idea中使用http请求解决中文乱码问题

    以请求百度为例,使用如下代码即可解决: GET https://www.baidu.com User-Agent: Mozilla/.X MetaSr 1.0

  9. SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】

    配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter ...

随机推荐

  1. django2.0关于path匹配路径页面刷新不出来的问题

    下面是官方文档的内容,如果在urls.py中使用到正则匹配路径(^$)的时候,就需要使用re_path,而不能使用path,不然页面会显示404错误, 如果未用到正则,那么使用path即可. re_p ...

  2. html 音频

    <!DOCTYPE html><meta charset="utf-8"><video src="movie.webm" cont ...

  3. 1:3访问 servlet API 的两种方式(request,session等内置对象)

    1:解耦方式 2:耦合方式: ========================================== ========================================== ...

  4. Ubuntu vim java 自动补全javacomeplete2

    一 安装vundle $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 默认安装在/.v ...

  5. ng-深度学习-课程笔记-15: 循环序列模型(Week1)

    1 数学符号(Notation) $ x^{<1>}, x^{<2>}, ..., x^{<t>}, ..., x^{<q>} $ 表示一段输入序列x, ...

  6. ng-深度学习-课程笔记-16: 自然语言处理与词嵌入(Week2)

    1 词汇表征(Word representation) 用one-hot表示单词的一个缺点就是它把每个词孤立起来,这使得算法对词语的相关性泛化不强. 可以使用词嵌入(word embedding)来解 ...

  7. HttpClient4.x 使用cookie保持会话

    HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分) ...

  8. Underscore-逐行分析

    标签: // Underscore.js 1.8.3// http://underscorejs.org// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud ...

  9. RESTful源码学习笔记之RPC和 RESTful 什么区别

    REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...

  10. [微信开发] - UnionID以及微信开放平台