从OSS下载文件属于远程下载,文件重名命一般有3种方案:
方案一
下载到服务器本地,然后服务器重命名rename一下就可以了,下载方法文档已经写得很清楚了
缺点:占用服务器空间,而且等待时间慢(需要先下载到服务器,然后重命名,然后再把文件内容返回给用户,如果文件很大,严重影响用户体验)
方案二
下载到服务器内存,然后服务器直接设置头部返回文件数据给用户
$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后,下载的文件就是重命名的文件,完美解决。
希望能帮助到遇到这个问题的人。
来源:CSDN
作者:skycyclone
链接:https://blog.csdn.net/skycyclone/article/details/103630780