记录一些遇见的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