记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题
Posted 叶不修233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题相关的知识,希望对你有一定的参考价值。
记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题
一、问题描述
springBoot项目上传文件到minio上,获取到文件url,直接在浏览器访问url(即预览文件)时,文件格式为txt时,会出现文件乱码问题。
二、问题原因
txt文件不是utf-8编码
三、解决方案
上传txt文件前,创建fileUtil工具类:手动设置txt文件编码格式后再上传
步骤:
(1)判断文件的编码格式
/**
* 判断文件的编码格式
* @param is
* @return 文件编码格式
* @throws Exception
*/
public static String getCharset(InputStream is) throws IOException
BufferedInputStream bin = new BufferedInputStream(is);
int p = (bin.read() << 8) + bin.read();//读取文件头前16位
String code = null;
switch (p)
case 0xefbb:
code = "UTF-8";
break;
case 0xfffe:
code = "Unicode";
break;
case 0xfeff:
code = "UTF-16";
break;
default:
code = "GB2312";
return code;
(2)将MultipartFile转换为File
/**
* 将MultipartFile转换为File
* @param multiFile
* @return
*/
public static File MultipartFileToFile(MultipartFile multiFile)
// 获取文件名
String fileName = multiFile.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 若须要防止生成的临时文件重复,能够在文件名后添加随机码
try
File file = File.createTempFile(fileName, prefix);
multiFile.transferTo(file);
return file;
catch (Exception e)
e.printStackTrace();
return null;
(3)解决txt乱码问题
/**
* 解决txt乱码问题
* @param is
* @param targetFile 转换完成后的新文件
* @param code 需要转换的文件的编码格式
* @return File
* @throws IOException
*/
public static File FileTurnUTF8(InputStream is, File targetFile, String code) throws IOException
if (!targetFile.exists())
targetFile.createNewFile();
BufferedReader br = null;
BufferedWriter bw = null;
br = new BufferedReader(new InputStreamReader(is, code));
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile), "UTF-8"));
int i = 0;
String str = "";
while ((str = br.readLine()) != null)
byte[] bytes = str.getBytes("UTF-8");
str = new String(bytes, 0, bytes.length);
bw.write(str + "\\r\\n");
br.close();
bw.close();
return targetFile;
(4)File 转 MultipartFile
/**
* File 转 MultipartFile
*
* @param file
* @throws Exception
*/
public static MultipartFile fileToMultipartFile(File file) throws Exception
FileInputStream fileInput = new FileInputStream(file);
// MultipartFile toMultipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
// IOUtils.toByteArray(fileInput));
MultipartFile toMultipartFile = new MultipartFileDto("file", file.getName(), "text/plain",
IOUtils.toByteArray(fileInput));
toMultipartFile.getInputStream();
return toMultipartFile;
四、需要注意的地方
- 将File 转 MultipartFile时,不能使用spring-test包中的MockMultipartFile方法转换。因为该依赖仅在开发环境生效,不会被打包。
以上是关于记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题的主要内容,如果未能解决你的问题,请参考以下文章
记录一些遇见的bug——记录一个使用多线程异步调用openfeign时子线程丢失request请求头导致的空指针异常错误
记录一些遇见的bug——axios请求报500,后端报错com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serial
记录一些遇见的bug——axios请求报500,后端报错com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serial
记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题
记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题
记录一些遇见的bug——项目启动报错org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.e