前言、
項(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);
}
原因 沒什么,就是麻煩,有輪子就用好輪子。