实现效果如下:
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | @RequestMapping (value = "/tools/printContract" ) public void cell(HttpServletResponse response,HttpServletRequest request,String outName) { //根据outName获取到保存在服务器上的文件 String filePath = request.getSession().getServletContext().getRealPath(ImgUtil.TOOLS_PATH+ImgUtil.TOOLS_TXT)+ '/' +outName+ ".txt" ; try (OutputStream out = response.getOutputStream()) { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat( "yyyyMMdd_HHmmss" ); String dateString = formatter.format(currentTime); //fileName是输出的文件的名字(不支持中文),包括了后缀 String fileName = "EncryptFile_" + dateString + ".txt" ; byte [] bytes = FileEcodeUtil.file2byte(filePath); response.setContentType( "application/x-msdownload" ); response.setHeader( "Content-Disposition" , "attachment;filename=" + fileName); response.setContentLength(bytes.length); out.write(bytes); out.flush(); } catch (IOException e) { //e.printStackTrace(); } } //上面用到的file2byte方法为: public static byte [] file2byte(String filePath) { byte [] buffer = null ; File file = new File(filePath); try (FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream()) { byte [] b = new byte [ 1024 ]; int n; while ((n = fis.read(b)) != - 1 ) { bos.write(b, 0 , n); } buffer = bos.toByteArray(); } catch (Exception e) { // e.printStackTrace(); } return buffer; } |
需要注意:返回值的类型是void 而不是String,不能返回到某一个页面,否则服务器会抛出IllegalStateException异常,虽然在页面上表现不出来。
java.lang.IllegalStateException: Cannot create a session after the response has been committed
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/196439/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)