spring使用文件流形式下载文件

网上关于java文件下载的代码不计其数,我在使用spring做文件下载时,开始也是使用的普通的下载方式,但是遇到一个问题,后台老是报错:java.net.SocketException: Connection reset by peer: socket write error,虽然文件是能下载,但是一下载就会报如上错误,google上一大片关于该问题的讨论,但究其原因,还得根据自身项目情况而言,网上的解决办法都没能阻止该错误的出现。我也因为无法确定到底是什么原因导致的,故改用另一种方式下载了,以下是大致源码:

Java代码 
  1. public String downLoadSongFile(HttpServletResponse response)  
  2. {  
  3.     InputStream fis = null;  
  4.   
  5.     try  
  6.     {  
  7.         String songName = "左右为难-蔡淳佳.mp3";  
  8.         String filePath = "d:/";  
  9.         File file = new File(filePath + songName);  
  10.         if (!file.exists())  
  11.         {  
  12.             return null;  
  13.         }  
  14.   
  15.         // 以流的形式下载文件  
  16.         fis = new BufferedInputStream(new FileInputStream(filePath));  
  17.   
  18.         doDownload(fis, response, songName);  
  19.   
  20.     }  
  21.     catch (IOException e)  
  22.     {  
  23.         e.printStackTrace();  
  24.     }  
  25.     finally  
  26.     {  
  27.         if (null != fis)  
  28.         {  
  29.             try  
  30.             {  
  31.                 fis.close();  
  32.             }  
  33.             catch (IOException e)  
  34.             {  
  35.                 e.printStackTrace();  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     return null;  
  41. }  
  42.   
  43. private void doDownload(InputStream inputStream, HttpServletResponse response, String songName) throws IOException  
  44. {  
  45.     response.setContentType("application/" + resolveContentType(songName));  
  46.     response.setHeader("Content-Disposition""attachment;" + "filename=" + songName);  
  47.     FileCopyUtils.copy(inputStream, response.getOutputStream());  
  48. }  
  49.   
  50. private String resolveContentType(String fileName)  
  51. {  
  52.     try  
  53.     {  
  54.         return fileName.substring(fileName.lastIndexOf(".") + 1);  
  55.     }  
  56.     catch (StringIndexOutOfBoundsException e)  
  57.     {  
  58.         return "";  
  59.     }  
  60. }  


这里的代码和常规用法的主要是以下这句代码:

FileCopyUtils.copy(inputStream, response.getOutputStream());

在上面的代码中,我们并没有显式地向页面输出内容,而是通过上面这句代码完成的,通过这种方式,终于解决了上面那个讨厌的错误的身影!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值