首页 > 编程语言 >java下载csv乱码问题

java下载csv乱码问题

时间:2022-09-02 17:33:29浏览次数:53  
标签:write outputStream java fis 乱码 new csv response

一.问题。

  用EXCEL打开文件时,总是产生乱码,但是用NOTEPAD++打开时,显示正常。然后,在NOTEPADD++的“格式”工具栏中查了一下文件编码,发现是“以UTF-8格式编码”。

二.解决方法。

  以CSV方式导出的文件中默认不含BOM信息,通过给将要输出的内容设置BOM标识(以 EF BB BF 开头的字节流)即可解决该问题。追加BOM标识 outputStream.write(0xef); outputStream.write(0xbb); outputStream.write(0xbf);

三.完整代码。

    @GetMapping(value = "/downloadFile",produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public Object download(String id,HttpServletResponse response) {
        try {
            DataCleanManagement dataCleanManagement = dataCleanManagementService.getById(id);
            if (dataCleanManagement == null){
                return ResultVO.fail("文件不存在");
            }
            String path = config.filePath + File.separator + dataCleanManagement.getFilePath() + File.separator + dataCleanManagement.getResultFile();
            File file = new File(path);

            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();

            // 清空response
            response.reset();
            // 设置response的Header,给文件名进行utf-8编码,不然下载的时候文件名乱码不对
            response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode (file.getName(), "UTF-8" ));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/vnd.ms-excel;charset=gb2312");
            outputStream.write(0xef);
            outputStream.write(0xbb);
            outputStream.write(0xbf);
            outputStream.write(buffer);
            outputStream.flush();
            outputStream.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            log.info(e.getLocalizedMessage(),e);
        }

        return null;
    }

以上代码请供参考,如有不当,请及时指出!

标签:write,outputStream,java,fis,乱码,new,csv,response
From: https://www.cnblogs.com/aozhestudy/p/16650672.html

相关文章

  • 【校招VIP】[Java][一本][6分]按照真实的技能点进行业务描述
    关注【校招VIP】公众号,回复【简历】,添加校招顾问微信,即可获取简历指导!本份简历是一位21届一本java同学的简历,简历评分6分。一、学员简历  二、指导意见简历版式问......
  • 【校招VIP】[Java][211][7分]重点展开与java开发有关的项目
    关注【校招VIP】公众号,回复【简历】,添加校招顾问微信,即可获取简历指导!本份简历是一位21届211硕java同学的简历,简历评分7分。一、学员简历  二、指导意见简历版式......
  • java 上传读取 excel
    implementationgroup:'org.apache.poi',name:'poi',version:'5.2.2' implementationgroup:'org.apache.poi',name:'poi-ooxml',version:'5.2.2'//exce......
  • java中List的详细用法
    目录:list中添加,获取,删除元素;list中是否包含某个元素;list中根据索引将元素数值改变(替换);list中查看(判断)元素的索引;根据元素索引位置进行的判断;利用list中索引位置重新生成......
  • Java try catch与throws区别
    原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这时用throws区别:当前程序需要继续运行就try当前程序不需要继续运行就throws举例:感冒了......
  • Java中具有继承的对象序列化
    在序列化中,当引入继承时,则根据超类和子类定义了某些情况,这使对每种情况下的序列化的理解变得更加简单。应遵循的基本规则如下。1.当超类实现时,可序列化接口而子类则不。......
  • java二维数组
    二维数组二维数组可以看成以数组为元素的数组。还可以有二维、三维、甚至更多维数组,但是实际开发中用的非常少。最多到二维数组(学习容器后,我们一般使用容器,二维数组用的......
  • Java基础
    Java基础注释//单行注释/*回车多行注释/**回车文档注释标识符和关键字数据类型publicclassDemo01{publicstaticvoidmain(String[]args){......
  • java Builder模式
    Builder 模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,一步一步创建一个复杂对象的创建型模式。在不知道内部建造细节的情况下,可以更精细的控......
  • 20个既简单又实用的JavaScript小技巧
    1.滚动到页面顶部我们可以使用window.scrollTo()平滑滚动到页面顶部。const scrollToTop = () => {  window.scrollTo({ top: 0, left: 0, behavior: "sm......