业务上遇到一个需要把txt文档响应回前端页面的需求,因为系统默认是utf-8格式的,所以在解析ansi等编码格式的txt文件时会乱码,这里就需要判断txt文件的编码格式是什么了。
在解决问题的途中看了很多文章,基本都没有用处,浪费了很多时间……
幸好看到了一位大佬的文章,解决了问题。
在这里疑惑一下,不能解决广泛问题的方法,为什么打着解决xxx问题的标签呢?真不是误导人吗?
cn.kmpro.model.core.File f = fileService.getCachedFile( fileId );
if (f == null) return new ResponseEntity<byte[]>( HttpStatus.NOT_FOUND );
String cd = f.getName() + "." + f.getExt();
String rtn = FileUtil.getAgentFileName( request, cd );
HttpHeaders headers = new HttpHeaders();
// headers.setContentType( FileUtil.whatType( f.getExt() ) );
headers.set( "Content-Disposition", "inline;" + rtn );
headers.set( "Content-Type", FileUtil.whatMimeType( f.getExt() ) );
String path = f.getPath();
java.io.File file = new java.io.File( "e://www.txt" );
headers.add( "Content-Length", String.valueOf( file.length() ) );
//以下是解析txt的编码格式,并把解析的数据返回前端
try (FileInputStream fileInputStream = new FileInputStream(file)){
byte[] buf = new byte[4096];
UniversalDetector detector = new UniversalDetector(null);
int nread;
while ((nread = fileInputStream.read(buf)) > 0 && !detector.isDone()) {
detector.handleData(buf, 0, nread);
}
detector.dataEnd();
String encoding = detector.getDetectedCharset();
detector.reset();
if(encoding == null || encoding.equals("IBM855") || encoding.equals("WINDOWS-1252")) encoding = "gbk";
logger.info("txt文件编码:"+encoding);
MediaType mediaType = new MediaType("text","txt", Charset.forName(encoding));
headers.setContentType(mediaType);
return new ResponseEntity<InputStreamResource>( new InputStreamResource( new FileInputStream(file) ), headers, HttpStatus.OK );
} catch (Exception e) {
logger.error("读取失败",e);
return new ResponseEntity<byte[]>( HttpStatus.NOT_FOUND );
}
解决方法来源
链接: 判断TXT文件的编码方式.