獲取遠(yuǎn)程文件的流

前言、
項(xiàng)目中需要一個下載的操作,庫表里記錄了文件的全路徑,但是頁面組件下載時,需要變成文件的流操作(獲取文件的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();
}

重點(diǎn)看這句

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

工具類所在包為

 import org.apache.commons.io.IOUtils;

主要用了URL對象處理路徑問題,用apache的開源工具IOUtils可以直接獲取字節(jié)數(shù)據(jù)
二、錯誤的操作
錯誤1、試圖new FIle對象來操作,然后用類似來操作

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

你會發(fā)現(xiàn)絕對路徑中的//和/轉(zhuǎn)義就夠你吃一壺了,極難獲取文件成功,生成的file對象
exist總是為false。
不建議2:

  URL r=new URL("");
    URLConnection connection= r.openConnection();
// 然后獲取輸入流
    BufferedInputStream bis =new BufferedInputStream(connection.getInputStream() );
//然后標(biāo)準(zhǔn)操作輸入流
 int size;
   //讀取文件內(nèi)容到緩存;
   while((size=bis.read(b,0,b.length))!=-1)   
   {   
    os.write(b,0,size);
   }

原因 沒什么,就是麻煩,有輪子就用好輪子。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容