实现从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,搭建一个在线教育视频课程分享网站。
相关文章
|
5天前
|
存储 弹性计算 运维
阿里云日常运维-购买服务器
这篇文章是关于如何在阿里云购买和配置云服务器ECS的教程。
27 6
阿里云日常运维-购买服务器
|
11天前
|
Linux
Linux 服务器下载百度网盘文件
本教程指导如何使用 `bypy` 库从百度网盘下载文件。首先通过 `pip install bypy` 安装库,接着运行 `bypy info` 获取登录链接并完成授权,最后将文件置于指定目录并通过 `bypy downdir /Ziya-13b-v1` 命令下载至本地。
18 1
Linux 服务器下载百度网盘文件
|
13天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
在云计算领域,阿里云凭借其强大的技术实力和丰富的产品线,为用户提供了一系列高效、便捷的云服务器产品。其中,轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、产品优势以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器全面解析:收费标准、产品优势及适用场景
|
17天前
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
阿里云轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、最新活动价格以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
|
6天前
|
弹性计算 安全 测试技术
阿里云的ECS云服务器应用例
在未来的远程办公时代,“未来空间”打造了一个高效、灵活且安全的在线协作平台,采用阿里云ECS云服务器作为核心基础设施。ECS提供按需付费的弹性计算能力,确保平台响应迅速并能应对流量高峰。其集成的安全特性如安全组和云盾,构建了多层次防护体系,保障数据安全。此外,ECS与阿里云其他服务无缝集成,如RDS、CDN和OSS,实现了高效的数据管理和全球低延迟访问。结合阿里云的机器学习服务,“未来空间”开发了智能会议摘要和情绪分析功能,提升了用户体验。凭借ECS的强大支持,该平台不仅实现了全球团队的高效协作,还赢得了市场的广泛认可,成为远程办公领域的标杆。
|
4天前
|
人工智能 运维 Cloud Native
专访阿里云:AI 时代服务器操作系统洗牌在即,生态合作重构未来
AI智算时代,服务器操作系统面临的挑战与机遇有哪些?
|
5天前
|
弹性计算 开发框架 数据可视化
阿里云虚拟主机和云服务器有什么区别?多角度全解析对比
阿里云虚拟主机与云服务器ECS的主要区别在于权限与灵活性。虚拟主机简化了网站搭建流程,预装常用环境,适合初级用户快速建站;而云服务器提供全面控制权,支持多样化的应用场景,如APP后端、大数据处理等,更适合具备技术能力的用户。尽管虚拟主机在价格上通常更优惠,但随着云服务器价格的下降,其性价比已超越虚拟主机,成为更具吸引力的选择。
|
16天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多样化的选择,包括CPU+GPU、CPU+FPGA等多种配置,适用于人工智能、机器学习和深度学习等计算密集型任务。其中,GPU服务器整合高性能CPU平台,单实例可实现最高5PFLOPS的混合精度计算能力。根据不同GPU类型(如NVIDIA A10、V100、T4等)和应用场景(如AI训练、推理、科学计算等),价格从数百到数千元不等。详情及更多实例规格可见阿里云官方页面。
|
18天前
|
存储 安全 文件存储
【服务器数据恢复】Apple苹果Xsan文件系统卷宗误操作导致文件丢失数据恢复案例
客户因误操作删除了macOS服务器上的重要图片和视频文件,需紧急恢复。Xsan文件系统作为苹果专为高负载环境设计的64位簇文件系统,在未有专门恢复工具的情况下,常规RAW恢复仅能提取小部分连续存储的小文件,且无目录结构。通过专业的数据恢复流程,包括安全挂载、阵列重组,并使用专用工具解析文件系统以恢复目录结构,最终成功恢复丢失的文件。此案例突显了Xsan文件系统的特点及其恢复难度。
23 1
|
10天前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
12 0
下一篇
DDNS