实现从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();

最后通过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();
		}
	}

上面这段代码就实现了用户自定义文件下载路径,并成功下载文件的方法!

——注意:

在实际使用该方法下载的过程中,可能遇到服务器不报错,但就是下载不下来文件的问题,这样有可能是前端页面发出下载请求的方式有误,必须是GET请求,而且不知道为什么,不能使用AJAX的get方式访问改方法,笔者使用的方式是用window.location.href访问,可能还有其它方式可以访问,笔者这里就不在说明了。

——关于批量下载阿里云上文件

本博文实现了从阿里云上下载单个文件的方法,由于会有人存在从阿里云上下载多个文件的需求,由此需求的同学可以结合本篇博客和我的另一篇博客

Java中的Zip进行多文件的保存

(地址:http://blog.csdn.net/sinat_28771747/article/details/78062275)

思路是:先从阿里云上获取需要下载的所有文件的文件流,并通过java的Zip将其压缩为一个压缩文件流,而后直接将压缩文件流作为下载文件的输入流即可实现多文件下载。



  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
阿里云OSS下载文件的步骤如下: 首先,需要引入阿里云的依赖包,例如在Maven项目中可以添加以下依赖: ```xml <!--阿里云oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` \[1\] 其次,在Controller中编写相应的方法来处理下载请求。例如: ```java // 相应的Controller @RequestMapping(value = "/download", method = RequestMethod.GET) public void downloadSource(HttpServletResponse response) { // oss服务器上相应的文件名 // 文件名必须正确,否则会报错 List<String> fileName = new ArrayList<>(); fileName.add("文件1.doc"); fileName.add("文件2.doc"); // 生成压缩包的文件名 String zipFileName = "test"; // 调用AliYunOssUtils的方法进行批量下载 AliYunOssUtils.batchDownLoadOssFile(fileName, zipFileName, response); } ``` \[2\] 最后,根据文件的URL链接获取OSS文件链接,并读取输入流进行下载。例如: ```java // 截取片段代码 URL url = new URL(urllink); // 打开到此URL的连接并返回一个用于从该连接读入的InputStream。 InputStream in = url.openStream(); String gaokuai_url = HttpUpload.uploadOSS(in, fileName); // 如果获取到了文件链接 if (!gaokuai_url.equals("")) { if (sb.length() > 0) { sb.append(tag + gaokuai_url); } else { sb.append(gaokuai_url); } } ``` \[3\] 以上是从阿里云OSS下载文件的步骤。您可以根据具体的需求和代码框架进行相应的调整和实现。 #### 引用[.reference_title] - *1* [Java调用阿里云oss下载文件](https://blog.csdn.net/Biexiansheng/article/details/121047471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [从阿里云OSS下载文件的总结](https://blog.csdn.net/qq_38749759/article/details/107863291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [阿里云OSS文件下载功能简易实现](https://blog.csdn.net/loongshawn/article/details/69396768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

於之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值