实现下载功能,首先需要实现上传功能, 上传实现可以参数我之前写的文章
实现方式:是根据上传完成后会返回url。所以下载也是根据url实现下载方法。具体实现请看下面代码:
以图片为例:
返回的url地址格式是: http://aa.xxxx.com:8080/FeedBack/xx/iOS_xxx_35671549541105750.jpg
一、文件下载
1、controller层写法:比较简单
/**
* 文件下载
* @param url 文件的url
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value = "/download",method = RequestMethod.GET)
@ResponseBody
public void downLoadFile(String url,HttpServletRequest request,HttpServletResponse response) throws Exception{
oSSImageService.downLoadFile(url, request, response);
}
2、service层:
@Override
public void downLoadFile(String url, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//上传图片完成会返回前端生成的url为: http://aa.xxxx.com:8080/FeedBack/xx/iOS_xxx_35671549541105750.jpg
// fileName :前台传入的文件名(主要是标识文件是什么格式.png或.zip)为:iOS_xxx_35671549541105750.jpg
// ossKey:上传文件时阿里云返回的标识 :FeedBack/xx/iOS_xxx_35671549541105750.jpg 这个就是文件标识
OSSClientUtil oss = new OSSClientUtil();
String ossKey = OSSGetURLAndKey.ossGetKey(url);
String fileName = OSSGetURLAndKey.ossGetURL(url);
System.out.println("ossKey="+ossKey +"---------fileName=" +fileName);
oss.downLoadFile(fileName, ossKey, request, response);
}
3、OSSGetURLAndKey工具类方法
public class OSSGetURLAndKey {
/**
* 获取文件名称
* @param url
* @return
*/
public static String ossGetURL(String url){
String[] strArray = url.split("/");
String fileName = strArray[strArray.length-1];
return fileName;
}
/**
* 获取ossKey
* @param url
* @return
*/
public static String ossGetKey(String url){
String[] strArray = url.split(":");
String urls = strArray[2].replace("8080/", ""); //这里上传的图片后,访问的时候是带端口的,所有需要单独处理掉
return urls;
}
}
4、downLoadFile方法:主要核心实现方式:在上传里面包装一个下载文件的类
public void downLoadFile(String fileName, String ossKey, HttpServletRequest request,HttpServletResponse response) throws IOException{
try {
//上传图片完成会返回前端生成的url为: http://aa.xxxx.com:8080/FeedBack/xx/iOS_xxx_35671549541105750.jpg
// fileName :前台传入的文件名(主要是标识文件是什么格式.png或.zip)为: iOS_xxx_35671549541105750.jpg,说白了就是文件名称
// ossKey:上传文件时阿里云返回的标识 :FeedBack/xx/iOS_xxx_35671549541105750.jpg 这个就是文件标识,说白就是文件的地址。
OSSObject ossObject = ossClient.getObject(bucketName, ossKey);//bucketName需要自己设置
// 已缓冲的方式从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
//BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject .getObjectContent()));
BufferedInputStream in=new BufferedInputStream(ossObject.getObjectContent());
// 缓冲文件输出流
BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
// 通知浏览器以附件形式下载
response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
byte[] car=new byte[1024];
int L=0;
while((L=in.read(car))!=-1){
out.write(car, 0,L);
}
if(out!=null){
out.flush(); // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
out.close();
}
if(in!=null){
in.close();
}
// 关闭OSSClient。
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
5、前端测试代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="js/jquery.min.js"></script>
<title></title>
</head>
<body>
<form action="#">
文件的url:<input type="text" name="url" id="url"/>
<input id="btn" type="button" value="sublimt"/>
</form>
</body>
<script >
document.getElementById('btn').onclick = function(){
var url = document.getElementById('url').value;
alert("url="+url);
location.href = 'http://localhost:8899/api/download?url=' + url ;
}
</script>
</html>
6、测试结果:测试视频是否可以下载,点击下载
下载成功 ,去本地看文件。
二、删除和下载差不多,列举主要删除的方法
/**
* 删除文件
* @param ossKey
* @param request
* @param response
* @return
*/
public String deleteFile(String ossKey, HttpServletRequest request,HttpServletResponse response){
try {
//上传图片完成会返回前端生成的url为: http://aa.xxxx.com:8080/FeedBack/xx/iOS_xxx_35671549541105750.jpg
// ossKey:上传文件时阿里云返回的标识 :FeedBack/xx/iOS_xxx_35671549541105750.jpg 这个就是文件标识
ossClient.deleteObject(bucketName, ossKey);
// 关闭OSSClient。
ossClient.shutdown();
return "success";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}