/** * 下载--测试 */ @GetMapping("download") public void download(HttpServletResponse response) throws SysInnerException { String outFileName = "下载文件名称(中文).txt"; String filePath = "D:\\000\\"; Path file = Paths.get(filePath, "原文件data-utf8 - 副本.txt"); if (Files.exists(file)) { // 设置Headers // response.setContentType("application/force-download"); response.setHeader("Content-Type", "application/octet-stream;charset=utf-8"); // 告诉浏览器输出内容为流 // Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。 // 该方式下载的文件名 中文乱码问题 // response.setHeader("Content-Disposition", "attachment;filename=" + outFileName); try { // 方法1: 设置下载的文件的名称-该方式已解决中文乱码问题,swagger,postman看到的是%...等,浏览器直接输url,OK response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(outFileName, ENCODING)); // 方法2: 设置下载的文件的名称-该方式已解决中文乱码问题,swagger,postman看到的是%...等,浏览器直接输url,OK( // 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码,中文不要太多,最多支持17个中文,因为header有150个字节限制。) response.setHeader("Content-Disposition", "attachment;filename=" + new String(outFileName.getBytes(ENCODING), "ISO8859-1")); // 方法3:设置下载的文件的名称-该方式已解决中文乱码问题,postman可以,,swagger看到的是%...等,浏览器直接输url,OK response.setHeader("Content-Disposition", "attachment;filename=" + outFileName + ";filename*=utf-8''" + URLEncoder.encode(outFileName, ENCODING)); } catch (UnsupportedEncodingException e) { message = "导入数据失败," + e.getMessage(); log.error(message); throw new SysInnerException(message); } try { Files.copy(file, response.getOutputStream()); } catch (IOException ex) { message = "导入数据失败," + ex.getMessage(); log.error(message); throw new SysInnerException(message); } } } } |
|