
现在有一个导出文本文件后,文本文件能用 GBK 编码打开的需求,但是原来的代码是这样的
InputStream inputStream = minioUtil.getObject(minioConfig.getBucketName(), fileVersion.getFsId()); 然后设置响应体的文件类型和响应头
response.setContentType(contentType); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); response.setHeader("Content-Length", "" + length); response.setHeader("fileName", "" + fileName); 然后通过这个工具类去把 inputstream 流到 outputstream
IOUtils.copy(inputStream, outputStream); 我的想法一开始是用
Reader r = new InputStreamReader(inputStream,"utf-8"); BufferedReader br = new BufferedReader(r); Writer w = new OutputStreamWriter(outputStream,"GBK"); BufferedWriter bw = new BufferedWriter(w); String s = null; while((s= br.readLine())!=null){ bw.write(s); } br.close(); bw.close(); 发现导出不了,发送的请求是 pending ,然后过了两分钟响应 200 ,弹不出文件保存框。 然后尝试用这个
byte[] buffer = new byte[8192]; int n; byte[] dest = new byte[8192]; while(-1 != (n = inputStream.read(buffer))) { dest=new String(buffer,0,n,"UTF-8").getBytes("GBK"); outputStream.write(dest); } 也失败,发送请求 pending ,响应是 504 Gateway Time-out nginx ,弹不出文件保存框。
1 temp178 2023-01-05 11:23:52 +08:00 第三段代码: 1 、是不是卡在 br.readLine() 了?建议 加日志看看具体 pending 到哪个位置 2 、浏览器下载文件,需要设置相关的响应头里的,可以查下相关资料 3 、bw 是服务端对浏览器的输出流,应该不用关闭,可以 flush 一下 |
2 w11ya OP 我在代码的最后加了个日志,日志内容输出了。浏览器下载文件我直接写 streamresponse.setContentType(application/octet-stream),也没用。txt 文件下载不了,但是可以下载 rar 文件,就是下到 99%就停了。已经 flush 了 |
3 sparklee 2023-01-05 12:05:57 +08:00 文件写完直接 redirect 一个 文件下载地址, |
4 OctopusGO 2023-01-05 13:30:04 +08:00 编码转换的有错误,先转换成 UTF-8,然后再用 GBK 读取还原成字符串,再写出 String s = new String(buffer,"UTF-8"); String s2 = new String(s.getBytes("GBK"), "GBK"); outputStream.write(s2.getBytes(),0,n); |
5 OpenSea 2023-01-05 13:31:02 +08:00 bw.close()后再 br.close() |
6 OpenJdk 2023-01-05 13:46:08 +08:00 |
8 OpenJdk 2023-01-05 13:49:20 +08:00 @OctopusGO 你这样拿不到该字符串的 GBK 编码字节流。得这样 String s = new String(buffer, "UTF-8"); outputStream.write(s.geyBytes("GBK"), 0, n) |
10 w11ya OP 谢谢大佬们的回复 |