文件下载中文乱码问题解决方案

开发过程中(web 服务器为 Tomcat7)我们难免会遇到文件下载的功能,可随之而来的就是当下载名称包含中文的文件时的乱码问题,今天博主在此记录一下遇到该问题的解决方案。(如果您的 web 服务器为 Tomcat8 请查看 Java代码下载功能在 Tomcat7、8 不同环境中,中文乱码问题

web.xml

<!-- 配置文件下载功能文件下载路径 -->
<context-param>
	<param-name>commonFile</param-name>
	<param-value>E:\</param-value>
</context-param>

DownloadUtil.java

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/download")
public class DownloadUtil {

	// 方式一
	@RequestMapping("/commonFile")
	public void downloadReport(@Param("fileName") String fileName, HttpServletRequest req, HttpServletResponse resp) {
		try {
			if (fileName != null && !fileName.equals("")) {
				// 转换文件名称编码格式
				String file = new String(fileName.getBytes("ISO8859-1"), "utf-8");
				// 设置响应头
				resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
				// 设置响应内容类型
				resp.setContentType(req.getServletContext().getMimeType(file));
				// 获取配置在 web.xml 中的文件路径
				String filePath = (String) req.getServletContext().getInitParameter("commonFile");
				// 获取文件流
				InputStream fis = new BufferedInputStream(new FileInputStream(filePath + "/" + file));
				byte[] buffer = new byte[fis.available()];
				fis.read(buffer);
				// 输出文件流
				OutputStream toClient = new BufferedOutputStream(resp.getOutputStream());
				toClient.write(buffer);
				// 关闭文件流
				toClient.flush();
				fis.close();
				toClient.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//  推荐:方式二
	@RequestMapping("/downloadFile")
	public ResponseEntity<byte[]> downloadCommonFile(@Param("fileName") String fileName, HttpServletRequest req, HttpServletResponse resp) {
		try {
			if (StringUtils.isNoneBlank(fileName)) {
				// 转换文件名称编码格式
				String file = new String(fileName.getBytes("ISO-8859-1"), "utf-8");
				// 获取配置在 web.xml 中的文件路径
				String filePath = (String) req.getServletContext().getInitParameter("commonFile");
				// 设置响应头
				HttpHeaders headers = new HttpHeaders();
				headers.setContentDispositionFormData("attachment", fileName);
				// 设置响应内容类型
				headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
				// 判断文件是否存在
				File downloadFile = new File(filePath + "/" + file);
				if(downloadFile.exists()){
					// 返回文件流
					return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(downloadFile), headers, HttpStatus.CREATED);
				}else{
					// 抛出文件未找到异常
					throw new FileNotFoundException();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}  

以上便是博主应对文件下载功能时中文乱码问题的解决方案,如有不懂敬请留言。

    原文作者:Supreme_Sir
    原文地址: https://blog.csdn.net/Supreme_Sir/article/details/88994581
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞