前言、
项目中需要一个下载的操作,库表里记录了文件的全路径,但是页面组件下载时,需要变成文件的流操作(获取文件的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);
}
原因 没什么,就是麻烦,有轮子就用好轮子。