WhyCan Forum(哇酷开发者社区)

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132, 微信: whycan_cn (哇酷网/挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2020-03-25 17:19:14

phpweb
会员
注册时间: 2020-02-05
累计积分: 68

OSS 下载文件重命名(aliyun php sdk) 转载

转载自: https://www.okcode.net/article/91595

从OSS下载文件属于远程下载,文件重名命一般有3种方案:

方案一
下载到服务器本地,然后服务器重命名rename一下就可以了,下载方法文档已经写得很清楚了
缺点:占用服务器空间,而且等待时间慢(需要先下载到服务器,然后重命名,然后再把文件内容返回给用户,如果文件很大,严重影响用户体验)

方案二
下载到服务器内存,然后服务器直接设置头部返回文件数据给用户

<?php
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$content = $ossClient->getObject($bucket, $object);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=demo.txt');
exit($content);
?>

缺点:占用服务器内存,如果文件较大,会导致内存溢出!!
而且等待时间也慢(也是需要本地服务器将文件内容下载到内存中才能输出给用户)

方案三
直接用SDK生成下载的签名URL,然后跳转到该URL,用户直接从OSS服务器下载文件,
速度极快,不受本地服务器带宽、空间、内存大小影响,可以说是非常完美的。
但是!官方没给出一个生成下载URL时重命名的功能!!!

研究了一大轮SDK的源码和文档,终于发现在OSS的API文档里,有一篇**

访问控制 / 在Header中包含签名 / 构建CanonicalizedResource的方法

** 的说明文档,这个参数提供在生成URL时能自定义构建响应头部,
其中一个备注说明有写到能自定义response-content-disposition这个关键的子资源。
经过试验能完美解决使用signUrl重命名的问题,代码如下:

/*阿里云主账号AccessKey拥有所有API的访问权限,风险很高。
强烈建议您创建并使用RAM账号进行API访问或日常运维,
请登录 https://ram.console.aliyun.com 创建RAM账号。
*/

$accessKeyId = "<yourAccessKeyId>";
$accessKeySecret = "<yourAccessKeySecret>";

// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$object = "<yourObjectName>";
$securityToken = "<yourSecurityToken>";

// 设置URL的有效期为3600秒。
$timeout = 3600;
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$new_file_name = '123.txt';
$oss_config = array(
	$ossClient::OSS_SUB_RESOURCE => 'response-content-disposition=attachment%3Bfilename%3D'.$new_file_name);

// 生成GetObject的签名URL。
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, $ossClient::OSS_HTTP_GET, $oss_config);

这样,用户跳转到生成的$signedUrl后,下载的文件就是重命名的文件,完美解决。
希望能帮助到遇到这个问题的人。

离线

#2 2020-03-25 17:20:33

phpweb
会员
注册时间: 2020-02-05
累计积分: 68

Re: OSS 下载文件重命名(aliyun php sdk) 转载

离线

页脚