FastAdmin 文件上传对象存储

项目中文件上传可以说是常见的,随着现在技术发展,大家通常都使用对象存储来存储静态文件,避免服务器需要购买昂贵的带宽。FastAdmin 的插件市场提供了付费的各大云服务商的插件,但他们实现是通过 WEB 直传方式,即浏览器端来直接上传到对象存储,但不方便小程序等的使用,比如微信小程序文件上传就不支持使用 PUT 协议。

其实是付费太贵了,,,为了支持更多的云服务商,我们又用上了 S3 API,基本大厂都支持,只需要配置好相关信息即可。目前使用来看,上传接口都是使用 ajax/upload,所以我们只需要修改这个文件即可完成。

1
$ composer require aws/aws-sdk-php

application\admin\controller\Ajax.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
protected function upload_handle($attachment)
{
if(strpos($attachment->url, '/') !== 0) {
$this->success(__('Uploaded successful'), '', ['url' => $attachment->url, 'fullurl' => $attachment->url]);
}

$path = $attachment->url;

$config = [
'credentials' => [
'key' => 'LTAI5t8ZZcDGw4EVv6dEXujWu', // Secret ID
'secret' => 'rlTofpCylKZwaCPP6Nq8TQPYXu0CUR', // Secret Key
],
'bucket' => 'hongfs-fastadmin-wybid50m9th7i591', // 存储桶名称
'endpoint' => 'https://oss-cn-shenzhen.aliyuncs.com', // Endpoint
'region' => 'cn-shenzhen', // 地域
'version' => '2006-03-01', // 版本号,固定
'domain' => '', // 域名
];

try {
$uploader = new \Aws\S3\MultipartUploader(new \Aws\S3\S3Client($config), ROOT_PATH . 'public' . $path, [
'bucket' => $config['bucket'],
'key' => substr($path, 1),
]);

// 执行上传操作
$result = $uploader->upload();
} catch (\Aws\Exception\MultipartUploadException $e) {
$this->error($e->getMessage());
}

unlink(ROOT_PATH . 'public' . $path);

// 修改附件的 URL
$attachment->url = $result['ObjectURL'];

// 如果有配置域名则需要进行替换
if($config['domain']) {
$attachment->url = $config['doamin'] . parse_url($attachment->url, PHP_URL_PATH);
}

$attachment->save();

$this->success(__('Uploaded successful'), '', ['url' => $attachment->url, 'fullurl' => $attachment->url]);
}
1
2
3
4
5
6
7
8
9
10
/**
* 上传文件
*/
public function upload()
{
...
// 注意:有两个地方需要替换
- $this->success(__('Uploaded successful'), '', ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);
+ $this->upload_handle($attachment);
}

注意:如果云服务商文档中的 endpoint 存在了存储桶名称,比如腾讯云,这需要把这部分去掉。

导入功能依靠本地文件,这块需要自己处理了。

往上