欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-01 21:24:57
...

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

开发过程中我们难免会遇到文件下载的功能,可随之而来的就是当下载名称包含中文的文件时的乱码问题,今天博主在此记录一下遇到该问题的解决方案。

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;
	}
}  

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