实现从oss(阿里云)服务器以附件形式下载文件(含批量下载)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 实现从oss(阿里云)服务器以附件形式下载文件(含批量下载) 笔者在项目中写一个从阿里云服务器上面以附件形式下载文件的接口时,遇到了问题,网上搜索无任何相关的解决方案,最后通过通过自己查阅API文档,再结合自己的经验,实现了下载功能。

实现从oss(阿里云)服务器以附件形式下载文件(含批量下载)

笔者在项目中写一个从阿里云服务器上面以附件形式下载文件的接口时,遇到了问题,网上搜索无任何相关的解决方案,最后通过通过自己查阅API文档,再结合自己的经验,实现了下载功能。

      通过查询oss官方文档,我发现只有一个下载文件到本地的方法(方法1),但是这个方法下载的文件只能够将文件下载到本地的一个固定的目录下,即必须要在API提供的方法中写死下载文件的下载路径,而且下载文件时没有任何下载提示,所以这个方法不适合直接在项目中使用。​

[java] view plain copy

 
  1. /**
  2.  * 从阿里云下载文件 (下载目录定死了的,无法更改)
  3.  * @param map
  4.  * @return
  5.  */
  6.    // endpoint以杭州为例,其它region请按实际情况填写
  7.    String endpoint = ”http://oss-cn-hangzhou.aliyuncs.com”;
  8.    // accessKey请登录https://ak-console.aliyun.com/#/查看
  9.    String accessKeyId = ”<yourAccessKeyId>”;
  10.    String accessKeySecret = ”<yourAccessKeySecret>”;
  11.    String bucketName = ”<yourBucketName>”;
  12.    // 创建OSSClient实例
  13.    OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  14.    // 下载object到文件  new File(“<yourLocalFile>”这个file对象需要给定一个本地目录,文件会下载到该目录中
  15.    ossClient.getObject(new GetObjectRequest(bucketName, “<yourKey>”), new File(“<yourLocalFile>”));
  16.    // 关闭client
  17.    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):

[java] view plain copy

 
  1. /**
  2.      * 从阿里云下载文件 (以附件形式下载)
  3.      * @param request
  4.      * @param response
  5.      */
  6. @ResponseBody
  7.     @RequestMapping(value = “/download”, method = RequestMethod.GET)
  8.     public void downLoadFile(HttpServletRequest request,HttpServletResponse response){
  9.         try {
  10.             String fileid = request.getParameter(”fileid”).toString();//从前台获取当前下载文件的id值(每个上传到阿里云的文件都会有一个独一无二的id值)
  11.             String filename =request.getParameter(”filename”).toString();//从前台获取要下载文件的文件名
  12.             int i=filename.lastIndexOf(“\\”);
  13.             filename=filename.substring(i+1);
  14.             String aliyunId = ApplicationPropertyUtils.getContextProperty(”ALIYUN_ACCESS_KEY_ID”);
  15.             String aliyunSecret = ApplicationPropertyUtils.getContextProperty(”ALIYUN_ACCESS_KEY_SECRET”);
  16.             String ossEndpoint =  ApplicationPropertyUtils.getContextProperty(”ALIYUN_OSS_ENDPOINT”);
  17.             OSSClient ossClient  = new OSSClient(ossEndpoint, aliyunId, aliyunSecret);
  18. //获取fileid对应的阿里云上的文件对象
  19.             OSSObject ossObject = ossClient.getObject(bucketName, fileid);//bucketName需要自己设置
  20. // 读去Object内容  返回
  21.             BufferedInputStream in=new BufferedInputStream(ossObject.getObjectContent());
  22.             //System.out.println(ossObject.getObjectContent().toString());
  23.             BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
  24. //通知浏览器以附件形式下载          
  25. response.setHeader(”Content-Disposition”,“attachment;filename=”+URLEncoder.enco  de(filename,“utf-8”));
  26.             //BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File(“f:\\a.txt”)));
  27.             byte[] car=new byte[1024];
  28.             int L=0;
  29.             while((L=in.read(car))!=-1){
  30.                 out.write(car, 0,L);
  31.             }
  32.             if(out!=null){
  33.                 out.flush();
  34.                 out.close();
  35.             }
  36.             if(in!=null){
  37.                 in.close();
  38.             }
  39.             ossClient.shutdown();
  40.         } catch (Exception e) {
  41.             e.printStackTrace();
  42.         }
  43.     }
/**
     * 从阿里云下载文件 (以附件形式下载)
     * @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访问,可能还有其它方式可以访问,笔者这里就不在说明了。

原文地址http://www.bieryun.com/3022.html

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
13天前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
|
5天前
|
人工智能 负载均衡 数据可视化
阿里云出手了,DeepSeek服务器拒绝繁忙,免费部署DeepSeek模型671B满血版
阿里云推出免费部署DeepSeek模型671B满血版服务,通过百炼大模型平台,用户无需编码,最快5分钟、最低0元即可完成部署。平台提供100万免费Token,支持DeepSeek-R1和DeepSeek-V3等多款模型调用,有效解决服务器繁忙问题。新手零基础也能轻松上手,享受高效稳定的API调用和自动弹性扩展功能。教程涵盖开通服务、获取API-KEY及配置Chatbox客户端等步骤,详细指引助您快速实现DeepSeek自由。
70 18
|
1天前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
12天前
|
机器学习/深度学习 人工智能 程序员
阿里云出手DeepSeek拒绝服务器繁忙,程序员直呼:真香!
阿里云PAI平台支持一键部署DeepSeek-V3和DeepSeek-R1大模型,用户无需编写代码即可完成从训练到部署的全过程。通过PAI Model Gallery,开发者可轻松选择并部署所需模型版本,享受高效、便捷的AI开发体验。教程详细介绍了开通PAI、选择模型及一键部署的具体步骤,帮助用户快速上手。
|
1天前
|
安全 JavaScript 测试技术
阿里云轻量应用服务器38元1年性能、适用场景简单测评
在阿里云目前的活动中,轻量云服务器2核2G200M峰值带宽每天10点和15点抢购价只要38元一年,e实例云服务器2核2G3M带宽99元1年,u1实例2核4G5M带宽199元一年。其中,阿里云轻量应用服务器38元1年的抢购价,让不少用户心动不已。那么,这款特价轻量应用服务器到底怎么样?是否值得购买呢?本文将从配置、性能、适用场景、价格优势等多个方面对这款轻量应用服务器做个介绍,以供参考。
阿里云轻量应用服务器38元1年性能、适用场景简单测评
|
7天前
|
人工智能 负载均衡 数据可视化
阿里云出手了,基于百炼一键部署DeepSeek满血版,告别服务器繁忙1
阿里云百炼平台推出一键部署DeepSeek-R1满血版671B模型,提供100万免费Token,无需编码,新手5分钟内即可完成部署。通过Chatbox客户端配置API,轻松实现模型调用,解决服务器繁忙问题,支持自动弹性扩展,降低硬件成本。详情及教程见阿里云百炼官网。
164 5
|
7天前
|
存储 安全 网络安全
阿里云国际站:阿里云服务器端口配置
悟空云@CloudWuKong阿里云是全球领先的云计算服务提供商,为用户提供弹性计算、数据库、存储、网络安全等一系列云计算服务。在使用阿里云服务器时,合理配置端口非常重要,可以提高服务器安全性和稳定性。
|
13天前
|
机器学习/深度学习 存储 弹性计算
阿里云gpu云服务器租用价格:最新收费标准及活动价格参考
阿里云gpu云服务器多少钱?A10卡GN7i GPU云服务器32核188G3213.99/1个月起,V100卡GN6v GPU云服务器8核32G3830.00/1个月起,阿里云GPU云服务器是基于GPU应用的计算服务,多适用于视频解码,图形渲染,深度学习,科学计算等应用场景,该产品具有超强计算能力、网络性能出色、购买方式灵活、高性能实例存储( GA1和GN5特有)等特点。下面小编来介绍下阿里云gpu云服务器最新的收费标准及活动价格。
|
8天前
|
消息中间件 监控 数据挖掘
【有奖实践】轻量消息队列(原 MNS)订阅 OSS 事件实时处理文件变动
当你需要对对象存储 OSS(Object Storage Service)中的文件变动进行实时处理、同步、监听、业务触发、日志记录等操作时,你可以通过设置 OSS 的事件通知规则,自定义关注的文件,并将 OSS 事件推送到轻量消息队列(原 MNS)的队列或主题中,开发者的服务即可及时收到相关通知,并通过消费消息进行后续的业务处理。
|
2天前
|
存储 弹性计算 人工智能
阿里云轻量应用服务器全球上新!
阿里云轻量应用服务器全球上新!
25 0