背景
php目前比较好用的框架就是Laravel,S3是亚马逊AWS提供的对象存储服务。有些公司使用的就是S3服务,比较我公司,所以整理了一份Laravel用的API文档。
API 文件上传/删除
1.安装扩展
代码语言:javascript复制composer require aws/aws-sdk-php-laravel
2.注册服务
代码语言:javascript复制#app/config/app.php
// 将下面代码追加到 providers 数组中
AwsLaravelAwsServiceProvider::class,
// 将下面代码追加到 aliases 数组中
'AWS' => AwsLaravelAwsFacade::class,
3.配置文件
代码语言:javascript复制#app/config/aws.php
<?php
return [
'aws-s3-xiaojin' => [
'version' => 'latest', //这个不用改
'region' => 'cn-northwest-1',
'scheme' => 'http',
'credentials' => [
'key' => 'xxxxxxxxxxxx', #访问秘钥
'secret' => 'xxxxxxxxxxxxx', #私有访问秘钥
]
],
];
4.配置路由
代码语言:javascript复制Route::get('/','S3TestController@index');
5.创建controller
代码语言:javascript复制<?php
namespace AppHttpControllers;
use IlluminateRoutingController as BaseController;
class S3TestController extends BaseController
{
public function index(){
dd(1234);
}
}
6.上传
代码语言:javascript复制 /**
* 上传到S3
*
* @Author xiaojin
* @DateTime 2023-02-20
* @return void
*/
public function add(){
$s3_return = $this->s3->putObject([
'Bucket' => $this->bucket,
'Key' => 'temp/tmp_xiaojin.png', //文件名(包括后缀名)
'Body' => file_get_contents('demo.jpg') //要上传的文件
]);
if($s3_return['@metadata']['statusCode'] == 200){
echo $s3_return['@metadata']['effectiveUri'];
} else {
echo '返回值错误 : return fail! ';
}
}
7.查询文件是否存在
代码语言:javascript复制 /**
* 查找文件是否存在S3
* 存在返回true
* 不存在就返回false
*
* @Author xiaojin
* @DateTime 2023-02-20
* @return void
*/
public function doesObjectExist()
{
dump($this->s3->doesObjectExist($this->bucket, 'temp/tmp_xiaojin.png')); //检测s3是否存在,空格转换会无法找到文件
}
8.删除文件
代码语言:javascript复制 /**
* 删除文件
*
* @Author xiaojin
* @DateTime 2023-02-20
* @return void
*/
public function del(){
$this->s3->deleteObjects([
'Bucket' => $this->bucket,
'Delete' => [
'Objects' => [['Key' => 'temp/tmp_xiaojin.png']]
]
]);
}
9.下载
代码语言:javascript复制 /**
* 生成AWS S3下载/上传文件url地址
* @param string $file 文件相对地址
* @param string $fileName 下载的文件名称
* @param string $expires 授权时间
* @return string
* ps: self::fileDownload('temp/tmp_xiaojin.png')
*/
public function fileDownload($file = '', $expires = ' 30 minutes')
{
//S3服务上传文件默认返回url过期时间为15分钟,通过设置过期时间,可以延迟到7天。
// $pathinfo = pathinfo($file);
// $fileName = $pathinfo['basename'];
//1.readStream 直接读取文件流
//2.创建过期时间访问
$cmd = $this->s3->getCommand('GetObject', [
'Bucket' => $this->bucket,
'Key' => $file, //地址, //'ResponseContentType' => 'text/plain', //'ResponseContentLanguage' => 'en-US', //'ResponseCacheControl' => 'No-cache', //'ResponseExpires' => gmdate(DATE_RFC2822, time() 3600),
// 'ResponseContentDisposition' => 'attachment; filename=' . $fileName,//访问链接直接下载
]);
$request = $this->s3->createPresignedRequest($cmd, $expires);
//创建预签名 URL
$presignedUrl = (string)$request->getUri();
echo $presignedUrl;
}
10.List
代码语言:javascript复制 /**
* list
*
* @Author xiaojin
* @DateTime 2023-02-20
* @return void
*/
public function list(){
$keys = $this->s3->listObjects([
'Bucket' => $this->bucket,
'Prefix' => 'backup/mysql/xtrabackup/incrbak/202302'
]);
foreach ($keys['Contents'] as $key) {
echo $key['Key'].'<br>';
}
}