小言_互联网的博客

PHP aws-sdk-php文件存储的实现与应用

330人阅读  评论(0)

前言

最近项目需要用到对象存储,将所有上传文件,存储到BOS云存储上。在开发过程中,遇到一些小小的问题,做个简单记录。

功能实现

1 下载sdk(以下两种方式,任选其一即可)

(1)使用composer 安装

composer require aws/aws-sdk-php

(2) 下载aws.phar

2 项目中使用,代码实现。


  
  1. <?php
  2. // sdk
  3. $bucket = 'upload'; // 容器名称[调整填写自己的容器名称]
  4. $key = 'index.html'; // 要上传的文件
  5. $region = 'us-east-1'; //地区
  6. $endpoint = 'https://obs-hazz.cucloud.cn'; //
  7. $ak = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'; // ak
  8. $sk = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'; // sk
  9. // https://github.com/aws/aws-sdk-php
  10. include 'aws.phar';
  11. // Register S3 Client
  12. $s3 = new Aws\S3\S3Client([
  13. 'version' => 'latest',
  14. 's3ForcePathStyle' => true,
  15. 'region' => $region,
  16. 'endpoint' => $endpoint,
  17. 'credentials' => [
  18. 'key' => $ak,
  19. 'secret' => $sk,
  20. ],
  21. // 'scheme' => 'http',
  22. // 'debug' => true,
  23. ]);
  24. // Put data to S3 bucket
  25. try
  26. {
  27. $key = '5.jpg';
  28. $s3-> putObject([
  29. 'Bucket' => $bucket,
  30. 'Key' => $key,
  31. 'Body' => fopen( $key, "r"),
  32. ]);
  33. }
  34. catch (Aws\S3\ Exception\S3Exception $e) {
  35. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  36. }
  37. // GET Object
  38. try
  39. {
  40. $result = $s3-> getObject([
  41. 'Bucket' => $bucket,
  42. 'Key' => $key
  43. ]);
  44. echo "\n---BEGIN---\n";
  45. echo $result[ 'Body'];
  46. echo "\n----END----\n\n";
  47. }
  48. catch (Aws\S3\ Exception\S3Exception $e) {
  49. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  50. }
  51. // GET Object head
  52. try
  53. {
  54. $result = $s3-> headObject([
  55. 'Bucket' => $bucket,
  56. 'Key' => $key,
  57. ]);
  58. echo "\n---BEGIN---\n";
  59. echo $result-> get( "LastModified");
  60. echo $result-> get( "ContentLength");
  61. echo $result-> get( "AcceptRanges");
  62. echo "\n----END----\n\n";
  63. }
  64. catch (Aws\S3\ Exception\S3Exception $e) {
  65. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  66. }
  67. // Delete object
  68. try
  69. {
  70. echo 'Attempting to delete ' . $key . '...' . PHP_EOL;
  71. $result = $s3-> deleteObject([
  72. 'Bucket' => $bucket,
  73. 'Key' => $key
  74. ]);
  75. }
  76. catch (Aws\S3\ Exception\S3Exception $e) {
  77. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  78. }

注意:

(1)以下是我程序中功能实现部分,项目中我只用到了文件上传与文件删除,各位工友使用的话要调整自己的配置哟~

(2)本地图片上传与抓取远程图片上传是不一样的哟~

(3)上传文件时要注意设置'ACL' => 'public-read';


  
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Author: xiaozhezhe
  4. // +----------------------------------------------------------------------
  5. use Aws\ S3\ S3Client;
  6. use Aws\ Exception\ AwsException;
  7. use GuzzleHttp\ Client;
  8. $bosConfig = config( 'basic.BOS_SET');
  9. $s3 = new S3Client([
  10. 'version' => 'latest',
  11. 's3ForcePathStyle' => true,
  12. 'region' => $bosConfig[ 'region'],
  13. 'endpoint' => $bosConfig[ 'endpoint'],
  14. 'credentials' => [
  15. 'key' => $bosConfig[ 'ak'],
  16. 'secret' => $bosConfig[ 'sk'],
  17. ],
  18. ]);
  19. // 本地上传图片到bos
  20. function uploadToBos($filename,$filepath)
  21. {
  22. try
  23. {
  24. $s3result = $s3-> putObject([
  25. 'Bucket' => $bosConfig[ 'bucket'],
  26. 'Key' => $filename,
  27. 'Body' => fopen( $filepath, "r"),
  28. 'ACL' => 'public-read'
  29. ]);
  30. } catch (Aws\S3\ Exception\S3Exception $e) {
  31. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  32. }
  33. $filePath = $s3result[ 'ObjectURL'] ?? "";
  34. return $filePath;
  35. }
  36. // 远程抓取图片上传bos
  37. function uploadOtherToBos($filename,$filepath)
  38. {
  39. $http = new Client();
  40. $res = $http-> request( 'GET', $filepath);
  41. try
  42. {
  43. $s3result = $s3-> putObject([
  44. 'Bucket' => $bosConfig[ 'bucket'],
  45. 'Key' => $filename,
  46. 'Body' => $res-> getBody(),
  47. 'ContentLength' => $res-> getHeader( 'content-length')[ 0],
  48. 'ACL' => 'public-read'
  49. ]);
  50. } catch (Aws\S3\ Exception\S3Exception $e) {
  51. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  52. }
  53. $filePath = $s3result[ 'ObjectURL'] ?? "";
  54. return $filePath;
  55. }
  56. // 删除远程bos图片
  57. function deleteBosFile($filename)
  58. {
  59. try
  60. {
  61. $result = $s3-> deleteObject([
  62. 'Bucket' => $bosConfig[ 'bucket'],
  63. 'Key' => $filename
  64. ]);
  65. return true;
  66. }
  67. catch (Aws\S3\ Exception\S3Exception $e) {
  68. exit( 'Error: ' . $e-> getAwsErrorMessage() . PHP_EOL);
  69. }
  70. }

常见问题

(1)上传不成功,一直转圈。

对接过程中,发现上传没什么反应,一直转圈圈,这个问题我查了很多文档,一直找不到原因,困扰了我一天,百思不得其解。

原因 :

       endpoint 地址配置问题;

解决方案:
          查看 endpoint 地址是否配置正确;切记切记,要检查所有的配置,保证配置正确!!!

(2)Curl 77/60 等问题

原因:

        证书问题

解决方案:

        (1)安装相关证书;

        (2) 我这边证书搞定之后还是crl问题,于是把 endpoint 地址从"https"更改为"http"就可以正常上传了;

(3)错误提示:payload content length is required and can not be calculated

原因:

        上传图片为链接,非本地图片

解决方案:

        (1)php 安装 guzzlehttp;
        (2)参考上述代码实现中的远程图片上传;

总结:

工作累了,要适当划水~~~

划水同时,要多喝热水~~~

要运动保持好身体~~~


转载:https://blog.csdn.net/qq_32845825/article/details/128255725
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场