java web中文名文件下载乱码处理

ie,edge,chrome浏览器中文名文件下载乱码问题处理

在网上查阅资料,以及根据自己这边实际的需求,来解决编码问题,以及在edge遇到的坑,不同的浏览器针对编码也不一样,做一次转码就顺利解决问题了,直接上代码

    @ApiOperation(value = "批量合成导出音频下载", notes = "批量合成导出音频下载")
    @RequestMapping(value = "/expoxt/download/file", method = RequestMethod.GET)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "filePath", value = "返回的文件名", dataType = "int", paramType = "query", example = "1.zip", required = true),
            @ApiImplicitParam(name = "taskName", value = "任务Name", dataType = "string", paramType = "query", required = true)
    })
    public ResponseEntity<byte[]> audioDetailTemplateDownloadZip(HttpSession session,String filePath,String taskName, HttpServletRequest request) throws Exception {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        String userAgent = request.getHeader("User-Agent");
        String fileName = taskName + ".zip";;
        if (userAgent.contains("Edge")) {
            //edge浏览器
            fileName = URLEncoder.encode(fileName, "utf-8");
            headers.add("Content-disposition", "attachment;filename="+fileName);
        } else if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            //IE浏览器处理
            headers.add("Content-disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"), "iso-8859-1"));
        } else {
            //非IE、edge浏览器的处理
            headers.add("Content-disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"), "iso-8859-1"));
        }
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(filePath)), headers, HttpStatus.OK);
    }

taskName,前端那边传过来的时候已经做了编码,框架是ssm,打断点查看taskName接收到的值已经解码了,这应该是框架本身解码了,这里特别注意的是edge浏览器,他的中文名需要在编码一次,然后放到header中,这样下载才不会乱码,其他浏览器就需要改变编码就行了

这里适配中英文下载,主要是想记录下自己遇到的坑,写的比较简单

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章