前言
最近项目需要用到对象存储,将所有上传文件,存储到BOS云存储上。在开发过程中,遇到一些小小的问题,做个简单记录。
功能实现
1 下载sdk(以下两种方式,任选其一即可)
(1)使用composer 安装
composer require aws/aws-sdk-php
(2) 下载aws.phar
2 项目中使用,代码实现。
-
<?php
-
// sdk
-
$bucket =
'upload';
// 容器名称[调整填写自己的容器名称]
-
$key =
'index.html';
// 要上传的文件
-
$region =
'us-east-1';
//地区
-
$endpoint =
'https://obs-hazz.cucloud.cn';
//
-
$ak =
'XXXXXXXXXXXXXXXXXXXXXXXXXX';
// ak
-
$sk =
'XXXXXXXXXXXXXXXXXXXXXXXXXX';
// sk
-
-
// https://github.com/aws/aws-sdk-php
-
include
'aws.phar';
-
-
// Register S3 Client
-
$s3 =
new
Aws\S3\S3Client([
-
'version' =>
'latest',
-
's3ForcePathStyle' =>
true,
-
'region' =>
$region,
-
'endpoint' =>
$endpoint,
-
'credentials' => [
-
'key' =>
$ak,
-
'secret' =>
$sk,
-
],
-
// 'scheme' => 'http',
-
// 'debug' => true,
-
]);
-
-
-
// Put data to S3 bucket
-
try
-
{
-
$key =
'5.jpg';
-
$s3->
putObject([
-
'Bucket' =>
$bucket,
-
'Key' =>
$key,
-
'Body' =>
fopen(
$key,
"r"),
-
]);
-
}
-
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
-
-
// GET Object
-
try
-
{
-
$result =
$s3->
getObject([
-
'Bucket' =>
$bucket,
-
'Key' =>
$key
-
]);
-
echo
"\n---BEGIN---\n";
-
echo
$result[
'Body'];
-
echo
"\n----END----\n\n";
-
}
-
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
-
-
// GET Object head
-
try
-
{
-
$result =
$s3->
headObject([
-
'Bucket' =>
$bucket,
-
'Key' =>
$key,
-
]);
-
echo
"\n---BEGIN---\n";
-
echo
$result->
get(
"LastModified");
-
echo
$result->
get(
"ContentLength");
-
echo
$result->
get(
"AcceptRanges");
-
echo
"\n----END----\n\n";
-
}
-
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
-
-
// Delete object
-
try
-
{
-
echo
'Attempting to delete ' .
$key .
'...' . PHP_EOL;
-
-
$result =
$s3->
deleteObject([
-
'Bucket' =>
$bucket,
-
'Key' =>
$key
-
]);
-
}
-
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
注意:
(1)以下是我程序中功能实现部分,项目中我只用到了文件上传与文件删除,各位工友使用的话要调整自己的配置哟~
(2)本地图片上传与抓取远程图片上传是不一样的哟~
(3)上传文件时要注意设置'ACL' => 'public-read';
-
<?php
-
// +----------------------------------------------------------------------
-
// | Author: xiaozhezhe
-
// +----------------------------------------------------------------------
-
use
Aws\
S3\
S3Client;
-
use
Aws\
Exception\
AwsException;
-
use
GuzzleHttp\
Client;
-
-
$bosConfig =
config(
'basic.BOS_SET');
-
$s3 =
new
S3Client([
-
'version' =>
'latest',
-
's3ForcePathStyle' =>
true,
-
'region' =>
$bosConfig[
'region'],
-
'endpoint' =>
$bosConfig[
'endpoint'],
-
'credentials' => [
-
'key' =>
$bosConfig[
'ak'],
-
'secret' =>
$bosConfig[
'sk'],
-
],
-
]);
-
-
// 本地上传图片到bos
-
function uploadToBos($filename,$filepath)
-
{
-
try
-
{
-
$s3result =
$s3->
putObject([
-
'Bucket' =>
$bosConfig[
'bucket'],
-
'Key' =>
$filename,
-
'Body' =>
fopen(
$filepath,
"r"),
-
'ACL' =>
'public-read'
-
]);
-
}
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
$filePath =
$s3result[
'ObjectURL'] ??
"";
-
return
$filePath;
-
}
-
-
// 远程抓取图片上传bos
-
function uploadOtherToBos($filename,$filepath)
-
{
-
$http =
new
Client();
-
$res =
$http->
request(
'GET',
$filepath);
-
try
-
{
-
$s3result =
$s3->
putObject([
-
'Bucket' =>
$bosConfig[
'bucket'],
-
'Key' =>
$filename,
-
'Body' =>
$res->
getBody(),
-
'ContentLength' =>
$res->
getHeader(
'content-length')[
0],
-
'ACL' =>
'public-read'
-
]);
-
}
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
$filePath =
$s3result[
'ObjectURL'] ??
"";
-
return
$filePath;
-
}
-
-
// 删除远程bos图片
-
function deleteBosFile($filename)
-
{
-
try
-
{
-
$result =
$s3->
deleteObject([
-
'Bucket' =>
$bosConfig[
'bucket'],
-
'Key' =>
$filename
-
]);
-
return
true;
-
}
-
catch (Aws\S3\
Exception\S3Exception
$e) {
-
exit(
'Error: ' .
$e->
getAwsErrorMessage() . PHP_EOL);
-
}
-
}
常见问题
(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
查看评论