从AWS S3换成阿里云OSS存储所踩的坑
2017-12-22 11:21
561 查看
因业务需要,AWS S3 不能使用了,要换成阿里云OSS存储和下载。简单作以记录,以作备忘。
1.参照https://help.aliyun.com/product/31815.html?spm=5176.2020520105.146.d500.30285e77DhksTQ 开通OSS服务并创建存储空间,得到访问的域名endpoint、AccessKeyID和AccessKeySecret;
2. 下载PC端ossbrowser工具,验证bucket建立、文件创建、上传和下载等基本操作,确保第1步正常;基于aws s3的大黄鸭CyberDuck访问阿里云oss bucket,总是报错,应该是两家工具不兼容;
3. 代码移植
根据不同的开发语言,到https://help.aliyun.com/product/31815.html?spm=5176.2020520105.146.d500.30285e77DhksTQ的SDK参考中打开对应语言的页面,如本例中是php的,页面如https://help.aliyun.com/document_detail/32099.html?spm=5176.product31815.6.758.u4tuGR
3.a 下载最新的php sdk https://github.com/aliyun/aliyun-oss-php-sdk?spm=5176.doc32099.2.4.mSN0jX, 目前是2.2.4
3.b 构建本地php开发环境,修改SDK中sample下的Config.php,即第1步中的域名、ak/sk, 然后运行 SDK中 samples下的RunAll.php 即可看到各case都能正常运行
3.c 根据示例程序了解OSS API, 可以是这里的例子 https://help.aliyun.com/document_detail/32101.html?spm=5176.doc32100.6.760.hd9tYF, 也可以是SDK中samples下的各个*.php,使用最多的是Object.php中的几个接口。网页中的一些接口描述尤其是返回值与samples中的有出入,最好是看samples中的代码示例
3.d 把sdk放到应用的protected/extension/aliyun-oss目录下,不用把SDK全部文件都放进去,只需要放src下的OSS目录,及入口函数autoload.php即可,
即 aliyun-oss
------ autoload.php
------- OSS/***
3.e 代码中遇到的问题及解决
3.e.1 file upload failed bucker_xx\/558be3c66aa2fda90452b6bc1acbd4d0
3.e.2 include(OssClient.php): failed to open stream:No such file or directory
3.e.3 "0:http body content is invalid: //// 上传size 为0的文件时,putObject会调用ossUtil::validateContent()对长度作判断,允许0长度文件时可以去掉此判断
\/OSS\/Core\/OssUtil.php:197:
\/OSS\/OssClient.php(978):OSS\\Core\\OssUtil::validateContent('''')\n
3.e.4 "ret":"0:上传的文件不存在
3.e.5 Error[8]: Trying to get property of non-object
3.e.6 "ret":"0:NoSuchKey: The specified keydoes not exist. RequestId: 5A39DB1D6FF1C5510C4153AF
3.e.7 Error[2]:filesize(): stat failed for file to be downloaded
3.e.8 通过浏览器下载文件要增加
header('Content-Type: application/octet-stream');
header('Content-Disposition:
attachment; filename="'.$downloadName.'"');
针对各个问题,归纳起来原因,主要在于aws s3与aliyun oss的接口设计差异及返回值差异,相对来说,aws s3的接口设计及参数尤其返回值obj中包含的信息更详细更完整些(如obj->header, obj->body等),aliyun oss的就相对简单很多,返回的obj就是object的内容,不包含各种辅助信息。
1.参照https://help.aliyun.com/product/31815.html?spm=5176.2020520105.146.d500.30285e77DhksTQ 开通OSS服务并创建存储空间,得到访问的域名endpoint、AccessKeyID和AccessKeySecret;
2. 下载PC端ossbrowser工具,验证bucket建立、文件创建、上传和下载等基本操作,确保第1步正常;基于aws s3的大黄鸭CyberDuck访问阿里云oss bucket,总是报错,应该是两家工具不兼容;
3. 代码移植
根据不同的开发语言,到https://help.aliyun.com/product/31815.html?spm=5176.2020520105.146.d500.30285e77DhksTQ的SDK参考中打开对应语言的页面,如本例中是php的,页面如https://help.aliyun.com/document_detail/32099.html?spm=5176.product31815.6.758.u4tuGR
3.a 下载最新的php sdk https://github.com/aliyun/aliyun-oss-php-sdk?spm=5176.doc32099.2.4.mSN0jX, 目前是2.2.4
3.b 构建本地php开发环境,修改SDK中sample下的Config.php,即第1步中的域名、ak/sk, 然后运行 SDK中 samples下的RunAll.php 即可看到各case都能正常运行
3.c 根据示例程序了解OSS API, 可以是这里的例子 https://help.aliyun.com/document_detail/32101.html?spm=5176.doc32100.6.760.hd9tYF, 也可以是SDK中samples下的各个*.php,使用最多的是Object.php中的几个接口。网页中的一些接口描述尤其是返回值与samples中的有出入,最好是看samples中的代码示例
3.d 把sdk放到应用的protected/extension/aliyun-oss目录下,不用把SDK全部文件都放进去,只需要放src下的OSS目录,及入口函数autoload.php即可,
即 aliyun-oss
------ autoload.php
------- OSS/***
3.e 代码中遇到的问题及解决
3.e.1 file upload failed bucker_xx\/558be3c66aa2fda90452b6bc1acbd4d0
3.e.2 include(OssClient.php): failed to open stream:No such file or directory
3.e.3 "0:http body content is invalid: //// 上传size 为0的文件时,putObject会调用ossUtil::validateContent()对长度作判断,允许0长度文件时可以去掉此判断
\/OSS\/Core\/OssUtil.php:197:
\/OSS\/OssClient.php(978):OSS\\Core\\OssUtil::validateContent('''')\n
3.e.4 "ret":"0:上传的文件不存在
3.e.5 Error[8]: Trying to get property of non-object
3.e.6 "ret":"0:NoSuchKey: The specified keydoes not exist. RequestId: 5A39DB1D6FF1C5510C4153AF
3.e.7 Error[2]:filesize(): stat failed for file to be downloaded
3.e.8 通过浏览器下载文件要增加
header('Content-Type: application/octet-stream');
header('Content-Disposition:
attachment; filename="'.$downloadName.'"');
针对各个问题,归纳起来原因,主要在于aws s3与aliyun oss的接口设计差异及返回值差异,相对来说,aws s3的接口设计及参数尤其返回值obj中包含的信息更详细更完整些(如obj->header, obj->body等),aliyun oss的就相对简单很多,返回的obj就是object的内容,不包含各种辅助信息。
具体实现的接口及调用接口: getOssClient: function getOssClient() { require_once ROOT_PATH.'/protected/extensions/aliyun-oss/autoload.php'; try { $client = new \OSS\OssClient(Yii::app()->params['aliyun.oss.key'],Yii::app()->params['aliyun.oss.secret'], Yii::app()->params['aliyun.oss.endpoint']); //endpoint即第1步中的域名 } catch (OssException $e) { print $e->getMessage(); } return $client; } if (!$client->doesBucketExist(self::OSS_BUCKET_NAME)) { $ret = $client->createBucket(self::OSS_BUCKET_NAME, OssClient::OSS_ACL_TYPE_PRIVATE); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } }catch(OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; } file_put_contents($destFile, $obj, FILE_APPEND); // getObject后在本地生成deskFile,可以再上传或导出。 调用sample: $client = getOssClient(); } try { $ret = $client->putObject(self::OSS_BUCKET_NAME, $objName, file_get_contents($filename)); try{ $obj = $client->getObject($bucket, $objName); if(strlen($obj) > 0) {
相关文章推荐
- 阿里云对象存储OSS价格是多少,有什么优惠吗?
- 开发手记OSSC-阿里云开发存储服务(OSS)的C SDK
- react使用阿里云对象存储,ali-oss, antd upload to ali-oss
- thinkPHP实现对象存储oss,将图片上传到阿里云oss
- 为阿里云存储开发的PHP PEAR 包:Services_Aliyun_OSS
- 阿里云对象存储OSS使用 HTTPS
- 阿里云对象存储服务,OSS使用经验总结,图片存储,分页查询
- AWS 存储产品[1]S3
- 阿里云OSS对象存储
- 上传文件到aws的s3存储
- 阿里云存储OSS之九大使用技巧
- 为阿里云存储开发的PHP PEAR 包:Services_Aliyun_OSS
- J2EE分布式架构集成阿里云OSS存储
- AWS S3存储服务SDK
- 对阿里云OSS对象存储的评价
- 阿里云的OSS对象存储 java
- JEESZ分布式架构集成阿里云OSS存储
- .Net程序测试阿里云OSS开放存储服务
- 浅析Docker私有镜像库与阿里云对象存储 OSS