前提需求:支持用户将oss端的文件进行下载使用。
1.最初分析,将oss端的文件下载到服务端 ==》再将服务端的文件提供用户下载 ==》用户下载完成后,删除服务端临时下载文件。
这样做第一、步骤复杂,加大了程序出错的概率。第二、效率低下,做了两次文件传输。
2.设想的最优方案,既然都是流的传输,如果能够实现 oss端的文件 ==》 用户端。
这样做明显比最初的方案,步骤简洁,不易出错,只要做一次传输,效率明显提高。
环境,jdk1.6.0_45。所以下文的资源释放还是最原始的方式。
实现的效果,用户客户端(Web浏览器)直接下载文件,对于其他客户端的下载,处理逻辑是相通的。
操作开始:
1.获取oss文件的对象(该对象就能获取其对应的流)。
//OSS client,每个项目封装都不太一样,获取OSSObject就是需要用到该实例
this.client = new OSSClient(OSS_ENDPOINT,ACCESS_ID, ACCESS_KEY);
//通过上面的client、bucket、key获取oss端文件的OSSObject
public OSSObject getOSSObject(String bucket,String key){
return client.getObject(bucket, key);
}
2.获取到oss端文件的OSSOBject之后,就可以直接将其进行下载操作了。下面代码核心逻辑用 * * 标注起来了。
public static void downLoadFile(OSSObject ossObject,HttpServletResponse response) throws IOException {
BufferedInputStream bis = null;
OutputStream toClient = null;
try {
//*获取ossObject的流*
bis = new BufferedInputStream(ossObject.getObjectContent(),512);
//获取oss端文件的文件名,用作于下载文件的名称
String[] arr = ossObject.getKey().split("/");
String fileName = arr[arr.length - 1];
response.reset();
toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
//处理文件名为中文的情况
response.setHeader("Content-Disposition","attach;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
//*处理oss文件流传输*
int number;
byte[] buffer = new byte[512];
while ((number = bis.read(buffer)) != -1){
toClient.write(buffer,0,number);
}
toClient.flush();
toClient.close();
}finally {
if(toClient != null){
toClient.close();
}
if(bis != null){
bis.close();
}
}
}
这样就大功告成了,是不是很简单,小伙伴赶紧去试试吧。