FC + OSS 简单图床

FC + OSS 简单图床

OSS

创建存储桶。

权限管理 -> 跨域设置。添加跨域支持。

FC

函数创建完成后点击配置服务。

到配置服务页面后下滑到最底部,需要拥有 AliyunOSSFullAccess 权限。

回到我们刚刚创建的函数,代码压缩包在文章底部,下载后进行上传保存。

回到函数概览页,配置初始化入口和环境变量。

1
2
3
oss_bucket= # OSS 桶名
oss_region= # OSS 地域
cdn_domain= # CDN 域名

上面我们已经配置好了程序,使用函数计算默认域名通过来访问 HTML 会变成下载(参考)。具体的设置可以看我之前 文章

代码

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php

use OSS\OssClient;
use RingCentral\Psr7\Response;

// 获取存储桶名称
$bucket = getenv('oss_bucket');
// 获取存储桶地域
$region = getenv('oss_region');
// OSS 全局存储
$oss = null;

function initializer($context) {
global $oss, $region;

if(is_null($oss)) {
// 实例化 OSS
// $oss = new OssClient(
// 'yourAccessKeyId',
// 'yourAccessKeySecret',
// 'https://oss-' . $region . '.aliyuncs.com'
// );
$oss = new OssClient(
$context['credentials']['accessKeyId'],
$context['credentials']['accessKeySecret'],
'https://oss-' . $region . '.aliyuncs.com',
false,
$context['credentials']['securityToken']
);
}
}

function handler($request, $context): Response{
global $oss, $bucket;

// 如果是 GET 的话直接返回前端文件,这个需要自定义域名支持。
if($request->getMethod() === 'GET') {
return new Response(
200,
[
'Content-type' => 'text/html; charset=utf-8',
],
file_get_contents(__DIR__ . '/index.html')
);
}

// 支持的类型和对应的后缀名
$types = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/webp' => 'webp',
];

// 获取 param 参数
$param = $request->getQueryParams();

if(!isset($param['type'])) {
return error('参数错误');
}

$type = $param['type'];

if(!isset($types[$type])) {
return error('不支持此格式');
}

// 生成文件路径
$filepath = generate_path($types[$type]);

// 获取签名
$sign = $oss->signUrl($bucket, $filepath, 10 * 60, 'PUT');

return result([
'sign' => $sign,
'url' => 'https://' . getenv('cdn_domain') . '/' . $filepath,
]);
}

/*
* 生成文件路径
*
* @param string $suffix 文件后缀
* @return string
*/
function generate_path($suffix) {
global $oss, $bucket;

$path = date('Ymd/') . str_rand() . '.' . $suffix;

$exist = $oss->doesObjectExist($bucket, $path);

if($exist) {
return generate_path($suffix);
}

return $path;
}

/*
* 随机字符串
*
* @param int $length 长度
* @return string
*/
function str_rand(int $length = 6){
$length = ($length < 4) ? 4 : $length;
return bin2hex(random_bytes(($length-($length%2))/2));
}

/**
* 返回成功
*
* @param array $data 数据
* @return RingCentral\Psr7\Response
*/
function result($data = []): Response {
return new Response(
200,
[],
json_encode([
'code' => 1,
'data' => $data,
])
);
}

/**
* 返回错误
*
* @param string $msg 错误信息
* @return RingCentral\Psr7\Response
*/
function error($msg): Response {
return new Response(
200,
[],
json_encode([
'code' => 0,
'msg' => $msg,
])
);
}

测试

预览

地址:https://tools.hongfs.cn/image_hosting


源码下载

往上