获取远程文件的流

前言、
项目中需要一个下载的操作,库表里记录了文件的全路径,但是页面组件下载时,需要变成文件的流操作(获取文件的byte[] 即可),因此就有了这个简单的需求。
一、正确操作
开源真香,直接一行代码搞定 省略部分代码(fileVO.getUrl()就是全路径类似"http://oss.com/aaa/bbb/xx.pdf")

public void downloadFile(String fileId, HttpServletResponse res){
  OutputStream os = res.getOutputStream();
  res.setHeader("Content-Disposition", "attachment; filename=\""+ new String( fileName.getBytes("gb2312"), "ISO8859-1" )+"\"" );
     os.write(IOUtils.toByteArray(new URL(fileVo.getUrl())));// 这种方式最好
     os.flush();
      os.close();
}

重点看这句

     os.write(IOUtils.toByteArray(new URL(fileFullPath)));

工具类所在包为

 import org.apache.commons.io.IOUtils;

主要用了URL对象处理路径问题,用apache的开源工具IOUtils可以直接获取字节数据
二、错误的操作
错误1、试图new FIle对象来操作,然后用类似来操作

FileUtils.readFileToByteArray(new File(fileVo.getUrl()))

你会发现绝对路径中的//和/转义就够你吃一壶了,极难获取文件成功,生成的file对象
exist总是为false。
不建议2:

  URL r=new URL("");
    URLConnection connection= r.openConnection();
// 然后获取输入流
    BufferedInputStream bis =new BufferedInputStream(connection.getInputStream() );
//然后标准操作输入流
 int size;
   //读取文件内容到缓存;
   while((size=bis.read(b,0,b.length))!=-1)   
   {   
    os.write(b,0,size);
   }

原因 没什么,就是麻烦,有轮子就用好轮子。

你可能感兴趣的:(获取远程文件的流)