Skip to content

Commit 6b96478

Browse files
authored
Merge pull request #360 from minguncle:feat-support-aliyunoss
Feat support aliyunoss
2 parents 81d9237 + f863e30 commit 6b96478

File tree

8 files changed

+349
-1
lines changed

8 files changed

+349
-1
lines changed

.env.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ PICGO_API_URL=https://www.picgo.net/api/1/upload
4848
CLOUDFLARE_IMGBED_URL=https://xxxxxxx.pages.dev/upload
4949
CLOUDFLARE_IMGBED_AUTH_CODE=xxxxxxxxx
5050
CLOUDFLARE_IMGBED_UPLOAD_FOLDER=
51+
# 阿里云OSS配置
52+
OSS_ENDPOINT=oss-cn-shanghai.aliyuncs.com
53+
OSS_ENDPOINT_INNER=oss-cn-shanghai-internal.aliyuncs.com
54+
OSS_ACCESS_KEY=LTAI5txxxxxxxxxxxxxxxx
55+
OSS_ACCESS_KEY_SECRET=yXxxxxxxxxxxxxxxxxxxxxx
56+
OSS_BUCKET_NAME=your-bucket-name
57+
OSS_REGION=cn-shanghai
5158
##########################################################################
5259
#########################stream_optimizer 相关配置########################
5360
STREAM_OPTIMIZER_ENABLED=false

app/config/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ def validate_mysql_config(cls, v: Any, info: ValidationInfo) -> Any:
9898
CLOUDFLARE_IMGBED_URL: str = ""
9999
CLOUDFLARE_IMGBED_AUTH_CODE: str = ""
100100
CLOUDFLARE_IMGBED_UPLOAD_FOLDER: str = ""
101+
# 阿里云OSS配置
102+
OSS_ENDPOINT: str = ""
103+
OSS_ENDPOINT_INNER: str = ""
104+
OSS_ACCESS_KEY: str = ""
105+
OSS_ACCESS_KEY_SECRET: str = ""
106+
OSS_BUCKET_NAME: str = ""
107+
OSS_REGION: str = ""
101108

102109
# 流式输出优化器配置
103110
STREAM_OPTIMIZER_ENABLED: bool = False

app/core/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
VALID_IMAGE_RATIOS = ["1:1", "3:4", "4:3", "9:16", "16:9"]
2828

2929
# 上传提供商
30-
UPLOAD_PROVIDERS = ["smms", "picgo", "cloudflare_imgbed"]
30+
UPLOAD_PROVIDERS = ["smms", "picgo", "cloudflare_imgbed", "aliyun_oss"]
3131
DEFAULT_UPLOAD_PROVIDER = "smms"
3232

3333
# 流式输出相关常量

app/handler/response_handler.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,16 @@ def _extract_image_data(part: dict) -> str:
304304
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
305305
upload_folder=settings.CLOUDFLARE_IMGBED_UPLOAD_FOLDER,
306306
)
307+
elif settings.UPLOAD_PROVIDER == "aliyun_oss":
308+
image_uploader = ImageUploaderFactory.create(
309+
provider=settings.UPLOAD_PROVIDER,
310+
access_key=settings.OSS_ACCESS_KEY,
311+
access_key_secret=settings.OSS_ACCESS_KEY_SECRET,
312+
bucket_name=settings.OSS_BUCKET_NAME,
313+
endpoint=settings.OSS_ENDPOINT,
314+
region=settings.OSS_REGION,
315+
use_internal=False
316+
)
307317
current_date = time.strftime("%Y/%m/%d")
308318
filename = f"{current_date}/{uuid.uuid4().hex[:8]}.png"
309319
base64_data = part["inlineData"]["data"]

app/service/image/image_create_service.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ def generate_images(self, request: ImageGenerationRequest):
131131
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
132132
upload_folder=settings.CLOUDFLARE_IMGBED_UPLOAD_FOLDER,
133133
)
134+
elif settings.UPLOAD_PROVIDER == "aliyun_oss":
135+
image_uploader = ImageUploaderFactory.create(
136+
provider=settings.UPLOAD_PROVIDER,
137+
access_key=settings.OSS_ACCESS_KEY,
138+
access_key_secret=settings.OSS_ACCESS_KEY_SECRET,
139+
bucket_name=settings.OSS_BUCKET_NAME,
140+
endpoint=settings.OSS_ENDPOINT,
141+
region=settings.OSS_REGION,
142+
use_internal=False
143+
)
134144
else:
135145
raise ValueError(
136146
f"Unsupported upload provider: {settings.UPLOAD_PROVIDER}"

app/templates/config_editor.html

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,6 +1814,7 @@ <h1 class="text-3xl font-extrabold text-center text-gray-800 mb-4">
18141814
<option value="smms" selected>SM.MS</option>
18151815
<option value="picgo">PicGo</option>
18161816
<option value="cloudflare_imgbed">Cloudflare</option>
1817+
<option value="aliyun_oss">阿里云OSS</option>
18171818
</select>
18181819
<small class="text-gray-500 mt-1 block">图片上传服务提供商</small>
18191820
</div>
@@ -1921,6 +1922,109 @@ <h1 class="text-3xl font-extrabold text-center text-gray-800 mb-4">
19211922
>Cloudflare图床的上传文件夹路径(可选)</small
19221923
>
19231924
</div>
1925+
1926+
<!-- 阿里云OSS配置 -->
1927+
<!-- OSS Endpoint -->
1928+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
1929+
<label
1930+
for="OSS_ENDPOINT"
1931+
class="block font-semibold mb-2 text-gray-700"
1932+
>OSS Endpoint</label
1933+
>
1934+
<input
1935+
type="text"
1936+
id="OSS_ENDPOINT"
1937+
name="OSS_ENDPOINT"
1938+
placeholder="oss-cn-shanghai.aliyuncs.com"
1939+
class="w-full px-4 py-3 rounded-lg form-input-themed"
1940+
/>
1941+
<small class="text-gray-500 mt-1 block">阿里云OSS的Endpoint地址</small>
1942+
</div>
1943+
1944+
<!-- OSS Access Key -->
1945+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
1946+
<label
1947+
for="OSS_ACCESS_KEY"
1948+
class="block font-semibold mb-2 text-gray-700"
1949+
>OSS Access Key</label
1950+
>
1951+
<input
1952+
type="text"
1953+
id="OSS_ACCESS_KEY"
1954+
name="OSS_ACCESS_KEY"
1955+
placeholder="LTAI5txxxxxxxxxx"
1956+
class="w-full px-4 py-3 rounded-lg sensitive-input form-input-themed"
1957+
/>
1958+
<small class="text-gray-500 mt-1 block">阿里云OSS的Access Key ID</small>
1959+
</div>
1960+
1961+
<!-- OSS Access Key Secret -->
1962+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
1963+
<label
1964+
for="OSS_ACCESS_KEY_SECRET"
1965+
class="block font-semibold mb-2 text-gray-700"
1966+
>OSS Access Key Secret</label
1967+
>
1968+
<input
1969+
type="password"
1970+
id="OSS_ACCESS_KEY_SECRET"
1971+
name="OSS_ACCESS_KEY_SECRET"
1972+
placeholder="yXxxxxxxxxxxxx"
1973+
class="w-full px-4 py-3 rounded-lg sensitive-input form-input-themed"
1974+
/>
1975+
<small class="text-gray-500 mt-1 block">阿里云OSS的Access Key Secret</small>
1976+
</div>
1977+
1978+
<!-- OSS Bucket Name -->
1979+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
1980+
<label
1981+
for="OSS_BUCKET_NAME"
1982+
class="block font-semibold mb-2 text-gray-700"
1983+
>OSS Bucket名称</label
1984+
>
1985+
<input
1986+
type="text"
1987+
id="OSS_BUCKET_NAME"
1988+
name="OSS_BUCKET_NAME"
1989+
placeholder="your-bucket-name"
1990+
class="w-full px-4 py-3 rounded-lg form-input-themed"
1991+
/>
1992+
<small class="text-gray-500 mt-1 block">阿里云OSS的Bucket名称</small>
1993+
</div>
1994+
1995+
<!-- OSS Region -->
1996+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
1997+
<label
1998+
for="OSS_REGION"
1999+
class="block font-semibold mb-2 text-gray-700"
2000+
>OSS Region</label
2001+
>
2002+
<input
2003+
type="text"
2004+
id="OSS_REGION"
2005+
name="OSS_REGION"
2006+
placeholder="cn-shanghai"
2007+
class="w-full px-4 py-3 rounded-lg form-input-themed"
2008+
/>
2009+
<small class="text-gray-500 mt-1 block">阿里云OSS的Region区域</small>
2010+
</div>
2011+
2012+
<!-- OSS Internal Endpoint (可选) -->
2013+
<div class="mb-6 provider-config" data-provider="aliyun_oss">
2014+
<label
2015+
for="OSS_ENDPOINT_INNER"
2016+
class="block font-semibold mb-2 text-gray-700"
2017+
>OSS内网Endpoint(可选)</label
2018+
>
2019+
<input
2020+
type="text"
2021+
id="OSS_ENDPOINT_INNER"
2022+
name="OSS_ENDPOINT_INNER"
2023+
placeholder="oss-cn-shanghai-internal.aliyuncs.com"
2024+
class="w-full px-4 py-3 rounded-lg form-input-themed"
2025+
/>
2026+
<small class="text-gray-500 mt-1 block">阿里云OSS的内网Endpoint地址(可选)</small>
2027+
</div>
19242028
</div>
19252029

19262030
<!-- 流式输出优化配置 -->

app/utils/helpers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,16 @@ def is_image_upload_configured(settings: Settings) -> bool:
211211
return bool(getattr(settings, "SMMS_SECRET_TOKEN", ""))
212212
if provider == "picgo":
213213
return bool(getattr(settings, "PICGO_API_KEY", ""))
214+
if provider == "aliyun_oss":
215+
return all(
216+
[
217+
getattr(settings, "OSS_ACCESS_KEY", ""),
218+
getattr(settings, "OSS_ACCESS_KEY_SECRET", ""),
219+
getattr(settings, "OSS_BUCKET_NAME", ""),
220+
getattr(settings, "OSS_ENDPOINT", ""),
221+
getattr(settings, "OSS_REGION", "")
222+
]
223+
)
214224
if provider == "cloudflare_imgbed":
215225
return all(
216226
[

0 commit comments

Comments
 (0)