实现从oss(阿里云)服务器以附件形式下载文件(含批量下载)
笔者在项目中写一个从阿里云服务器上面以附件形式下载文件的接口时,遇到了问题,网上搜索无任何相关的解决方案,最后通过通过自己查阅API文档,再结合自己的经验,实现了下载功能。
通过查询oss官方文档,我发现只有一个下载文件到本地的方法(方法1),但是这个方法下载的文件只能够将文件下载到本地的一个固定的目录下,即必须要在API提供的方法中写死下载文件的下载路径,而且下载文件时没有任何下载提示,所以这个方法不适合直接在项目中使用。
- /**
- * 从阿里云下载文件 (下载目录定死了的,无法更改)
- * @param map
- * @return
- */
- // endpoint以杭州为例,其它region请按实际情况填写
- String endpoint = ”http://oss-cn-hangzhou.aliyuncs.com”;
- // accessKey请登录https://ak-console.aliyun.com/#/查看
- String accessKeyId = ”<yourAccessKeyId>”;
- String accessKeySecret = ”<yourAccessKeySecret>”;
- String bucketName = ”<yourBucketName>”;
- // 创建OSSClient实例
- OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- // 下载object到文件 new File(“<yourLocalFile>”这个file对象需要给定一个本地目录,文件会下载到该目录中
- ossClient.getObject(new GetObjectRequest(bucketName, “<yourKey>”), new File(“<yourLocalFile>”));
- // 关闭client
- ossClient.shutdown();
/** * 从阿里云下载文件 (下载目录定死了的,无法更改) * @param map * @return */ // endpoint以杭州为例,其它region请按实际情况填写 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // accessKey请登录https://ak-console.aliyun.com/#/查看 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; // 创建OSSClient实例 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 下载object到文件 new File("<yourLocalFile>"这个file对象需要给定一个本地目录,文件会下载到该目录中 ossClient.getObject(new GetObjectRequest(bucketName, "<yourKey>"), new File("<yourLocalFile>")); // 关闭client ossClient.shutdown();
最后通过API文档发现:
在“下载板块”第一个“以流形式”下载文件的方法中,“ossObject.getObjectContent()”方法可以获取指定id的文件并返回一个字节流,因此可以利用这个特性,自己改造一个方法(方法2):
- /**
- * 从阿里云下载文件 (以附件形式下载)
- * @param request
- * @param response
- */
- @ResponseBody
- @RequestMapping(value = “/download”, method = RequestMethod.GET)
- public void downLoadFile(HttpServletRequest request,HttpServletResponse response){
- try {
- String fileid = request.getParameter(”fileid”).toString();//从前台获取当前下载文件的id值(每个上传到阿里云的文件都会有一个独一无二的id值)
- String filename =request.getParameter(”filename”).toString();//从前台获取要下载文件的文件名
- int i=filename.lastIndexOf(“\\”);
- filename=filename.substring(i+1);
- String aliyunId = ApplicationPropertyUtils.getContextProperty(”ALIYUN_ACCESS_KEY_ID”);
- String aliyunSecret = ApplicationPropertyUtils.getContextProperty(”ALIYUN_ACCESS_KEY_SECRET”);
- String ossEndpoint = ApplicationPropertyUtils.getContextProperty(”ALIYUN_OSS_ENDPOINT”);
- OSSClient ossClient = new OSSClient(ossEndpoint, aliyunId, aliyunSecret);
- //获取fileid对应的阿里云上的文件对象
- OSSObject ossObject = ossClient.getObject(bucketName, fileid);//bucketName需要自己设置
- // 读去Object内容 返回
- BufferedInputStream in=new BufferedInputStream(ossObject.getObjectContent());
- //System.out.println(ossObject.getObjectContent().toString());
- BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
- //通知浏览器以附件形式下载
- response.setHeader(”Content-Disposition”,“attachment;filename=”+URLEncoder.enco de(filename,“utf-8”));
- //BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File(“f:\\a.txt”)));
- 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.shutdown();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
/** * 从阿里云下载文件 (以附件形式下载) * @param request * @param response */ @ResponseBody @RequestMapping(value = "/download", method = RequestMethod.GET) public void downLoadFile(HttpServletRequest request,HttpServletResponse response){ try { String fileid = request.getParameter("fileid").toString();//从前台获取当前下载文件的id值(每个上传到阿里云的文件都会有一个独一无二的id值) String filename =request.getParameter("filename").toString();//从前台获取要下载文件的文件名 int i=filename.lastIndexOf("\\"); filename=filename.substring(i+1); String aliyunId = ApplicationPropertyUtils.getContextProperty("ALIYUN_ACCESS_KEY_ID"); String aliyunSecret = ApplicationPropertyUtils.getContextProperty("ALIYUN_ACCESS_KEY_SECRET"); String ossEndpoint = ApplicationPropertyUtils.getContextProperty("ALIYUN_OSS_ENDPOINT"); OSSClient ossClient = new OSSClient(ossEndpoint, aliyunId, aliyunSecret); //获取fileid对应的阿里云上的文件对象 OSSObject ossObject = ossClient.getObject(bucketName, fileid);//bucketName需要自己设置 // 读去Object内容 返回 BufferedInputStream in=new BufferedInputStream(ossObject.getObjectContent()); //System.out.println(ossObject.getObjectContent().toString()); BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream()); //通知浏览器以附件形式下载 response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.enco de(filename,"utf-8")); //BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File("f:\\a.txt"))); 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.shutdown(); } catch (Exception e) { e.printStackTrace(); } }
上面这段代码就实现了用户自定义文件下载路径,并成功下载文件的方法!
——注意:
在实际使用该方法下载的过程中,可能遇到服务器不报错,但就是下载不下来文件的问题,这样有可能是前端页面发出下载请求的方式有误,必须是GET请求,而且不知道为什么,不能使用AJAX的get方式访问改方法,笔者使用的方式是用window.location.href访问,可能还有其它方式可以访问,笔者这里就不在说明了。