java常用小技巧:下载文件时文件名中文乱码

下载文件时中文乱码是一个很常见的问题, 这不是第一次,但我希望它是最后一次了

这是个让人很头疼的问题, 明明在后台文件名还是正常的,为什么下载后文件名就乱码了呢

为什么会乱码:因为浏览器的编码和后台传的编码不一致,这就好比火星人(###)和水星人(***)用方言讲话,结果肯定是谁也听不懂,

那如何解决交流时语言不通的问题呢, 那就用一个统一的语言【UTF-8】作为双方的沟通的语言吧

附下载方法

@ApiOperation("MinIO文件下载")
@GetMapping("/generateFileDown")
public BaseRetBean generateFileDown(
        @ApiParam(value = "主键编号",required = true) @RequestParam(value = "id",required = true) String id,
        HttpServletResponse response
) throws Exception {
    BaseRetBean baseRetBean = new BaseRetBean();

    // 自己的业务逻辑
    GmFileBean gmFileBean = workOrderService.queryFileById(id);

    if (gmFileBean==null) {
        baseRetBean.setRet(0);
        baseRetBean.setMsg("对象为空");
        return baseRetBean;
    }
    String fileName = gmFileBean.getFile_name();
    // 存储桶名称
    String bucketName="work-order";
    InputStream inputStream = minioUtil.getObject(bucketName,gmFileBean.getData());

    // 数据为空
    if (inputStream == null) {
        baseRetBean.setRet(0);
        baseRetBean.setMsg("文件为空");
        return baseRetBean;
    }

    byte[] data = inputStreamToByteArray(inputStream);

    try {
        // 清除第一行
        response.reset();
        // 用于描述HTTP消息实体的传输长度
        response.addHeader("Content-Length", "" + data.length);
        // Content-disposition 以附件的方式下载文件, 文件名用encode编码
        response.setHeader("Content-Disposition", "attachment; filename=\""+ URLEncoder.encode(fileName,"utf-8")+"\"");
        // 告诉浏览器文件的编码格式
        response.setContentType("application/"+gmFileBean.getType()+";charset=UTF-8");

        IOUtils.write(data, response.getOutputStream());
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    baseRetBean.setRet(1);
    baseRetBean.setMsg("查询成功");
    return baseRetBean;
}

 

 

你可能感兴趣的:(java下载,文件名中文乱码,java,乱码,java)