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

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 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快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
相关文章
|
7月前
|
存储 人工智能 Cloud Native
阿里云渠道商:OSS与传统存储系统的差异在哪里?
本文对比传统存储与云原生对象存储OSS的架构差异,涵盖性能、成本、扩展性等方面。OSS凭借高持久性、弹性扩容及与云服务深度集成,成为大数据与AI时代的优选方案。
|
9月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
9月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
366 0
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
存储 JavaScript 前端开发
Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】
这篇文章介绍了在Vue中实现图片上传到阿里云OSS对象存储服务的完整流程,包括服务端签名直传的前提知识、后端设置、前端组件封装以及图片上传和回显的效果展示。
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
319 1
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。