文档章节

oss(阿里云)服务器以附件形式下载文件

明天_你好lzr
 明天_你好lzr
发布于 2016/12/08 16:26
字数 803
阅读 289
收藏 0

笔者在项目中写一个从阿里云服务器上面以附件形式下载文件的接口时,遇到了问题,网上搜索无任何相关的解决方案,最后通过通过自己查阅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访问,可能还有其它方式可以访问,笔者这里就不在说明了。

© 著作权归作者所有

共有 人打赏支持
明天_你好lzr
粉丝 0
博文 6
码字总数 2603
作品 0
杭州
程序员
私信 提问
整合百度UEditor上传图片到阿里云OSS

前言 将图片上传到阿里云OSS是一种趋势,一个必然。当你的项目图片过多,需要频繁上传和替换的时候,用阿里云OSS可以很方便的管理你的图片,节省服务器空间,大大提高了效率。阿里云OSS是阿里...

zacklee
2017/09/17
0
0
阿里云助开发者轻松使用云产品 ——灵活配置、轻松管理、架构部署不求人

阿里云助开发者轻松使用云产品 ——灵活配置、轻松管理、架构部署不求人 想上云,但是又担心自身技术不过关? 给您一个工具,降低云计算使用门槛,让您轻松使用云产品! 项目不等人,但又人手...

阿里云官方博客
2014/04/03
1K
0
最新阿里云OSS文件上传部署

1、前往阿里云github下载SDK包:https://github.com/aliyun/aliyun-oss-php-sdk/releases。 这里介绍源码部署:Source code下载下来。.phar其实就是一个打包文件,直接引用后就能用,大家自己...

IT阿飞
2017/09/04
0
0
阿里云服务器ECS将数据备份到oss上的具体步骤

背景 网站的数据就是网站的灵魂,可是数据总是会因为各种原因,如服务器损坏,人员误操作而丢失 ,站长们最需要的就是能及时备份自己的数据。对于win服务器下的自动数据备份,网站文件,自然...

顶风走千里
2017/12/05
0
0
最新整合阿里云OSS方法-phpcms

1、为简化整合步骤,使用该方法整合后,默认是所有图片、附件都要上传至OSS,并未在后台设置中添加是否启用OSS的开关。 2、上传的图片或附件,还是会在PHPCMS所在服务器保留一份。主要是基于...

豆花饭烧土豆
2016/11/10
11
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

阿里云官方博客
43分钟前
1
0
Coding and Paper Letter(四十四)

资源整理。 1 Coding: 1.Rstudio2019年会“机器学习应用”的幻灯片,代码和数据 rstudio conf 2019 2.R语言包sparkxgb,Spark上XGBoost的R接口。 sparkxgb 3.自动SQL注入和数据库接管工具。 ...

胖胖雕
45分钟前
3
0
Ubuntu最新的主要操作系统放弃32位支持?

现在是2018年,2019年即将到来——64位处理器已经成为主流很长一段时间了。如果你仍然使用32位的电脑,那么是时候把它扔进垃圾箱了。 我为所有基于Linux的操作系统维护者感到自豪,他们有勇气...

Linux就该这么学
46分钟前
1
0
Fundebug发布Vue插件,简化BUG监控接入代码

摘要: 代码越短越好! 我们发布了fundebug-vue插件,可以简化Vue框架接入Fundebug的代码。 Vue如何接入Fundebug 1. 安装fundebug-javascript与fundebug-vue npm install fundebug-javascrip...

Fundebug
54分钟前
2
0
MySQL学习笔记之二

数据库的操作总结就是:增删改查(CURD),今天记录一下基础的检索查询工作。 检索MySQL 1.查询表中所有的记录 mysql> select * from apps;+----+------------+-----------------------+------...

凌宇之蓝
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部