mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-09-05 23:56:37 +08:00
feat: 支持CloudFlare图床自定义上传文件夹路径
- 新增CLOUDFLARE_IMGBED_UPLOAD_FOLDER环境变量配置 - 用户可通过该配置项指定图片在CloudFlare图床中的上传路径
This commit is contained in:
@@ -43,6 +43,7 @@ SMMS_SECRET_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|||||||
PICGO_API_KEY=xxxx
|
PICGO_API_KEY=xxxx
|
||||||
CLOUDFLARE_IMGBED_URL=https://xxxxxxx.pages.dev/upload
|
CLOUDFLARE_IMGBED_URL=https://xxxxxxx.pages.dev/upload
|
||||||
CLOUDFLARE_IMGBED_AUTH_CODE=xxxxxxxxx
|
CLOUDFLARE_IMGBED_AUTH_CODE=xxxxxxxxx
|
||||||
|
CLOUDFLARE_IMGBED_UPLOAD_FOLDER=
|
||||||
##########################################################################
|
##########################################################################
|
||||||
#########################stream_optimizer 相关配置########################
|
#########################stream_optimizer 相关配置########################
|
||||||
STREAM_OPTIMIZER_ENABLED=false
|
STREAM_OPTIMIZER_ENABLED=false
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ ENV TOOLS_CODE_EXECUTION_ENABLED=false
|
|||||||
ENV IMAGE_MODELS='["gemini-2.0-flash-exp"]'
|
ENV IMAGE_MODELS='["gemini-2.0-flash-exp"]'
|
||||||
ENV SEARCH_MODELS='["gemini-2.0-flash-exp","gemini-2.0-pro-exp"]'
|
ENV SEARCH_MODELS='["gemini-2.0-flash-exp","gemini-2.0-pro-exp"]'
|
||||||
ENV URL_NORMALIZATION_ENABLED=false
|
ENV URL_NORMALIZATION_ENABLED=false
|
||||||
|
ENV CLOUDFLARE_IMGBED_UPLOAD_FOLDER=""
|
||||||
|
|
||||||
# Expose port
|
# Expose port
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ If you want to run the source code directly locally for development or testing,
|
|||||||
| `PICGO_API_KEY` | Optional, API Key for [PicoGo](https://www.picgo.net/) image hosting | `your-picogo-apikey` |
|
| `PICGO_API_KEY` | Optional, API Key for [PicoGo](https://www.picgo.net/) image hosting | `your-picogo-apikey` |
|
||||||
| `CLOUDFLARE_IMGBED_URL` | Optional, [CloudFlare](https://github.com/MarSeventh/CloudFlare-ImgBed) image hosting upload address | `https://xxxxxxx.pages.dev/upload` |
|
| `CLOUDFLARE_IMGBED_URL` | Optional, [CloudFlare](https://github.com/MarSeventh/CloudFlare-ImgBed) image hosting upload address | `https://xxxxxxx.pages.dev/upload` |
|
||||||
| `CLOUDFLARE_IMGBED_AUTH_CODE` | Optional, authentication key for CloudFlare image hosting | `your-cloudflare-imgber-auth-code` |
|
| `CLOUDFLARE_IMGBED_AUTH_CODE` | Optional, authentication key for CloudFlare image hosting | `your-cloudflare-imgber-auth-code` |
|
||||||
|
| `CLOUDFLARE_IMGBED_UPLOAD_FOLDER` | Optional, upload folder path for CloudFlare image hosting | `""` |
|
||||||
| **Stream Optimizer Related** | | |
|
| **Stream Optimizer Related** | | |
|
||||||
| `STREAM_OPTIMIZER_ENABLED` | Optional, whether to enable stream output optimization | `false` |
|
| `STREAM_OPTIMIZER_ENABLED` | Optional, whether to enable stream output optimization | `false` |
|
||||||
| `STREAM_MIN_DELAY` | Optional, minimum delay for stream output | `0.016` |
|
| `STREAM_MIN_DELAY` | Optional, minimum delay for stream output | `0.016` |
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ app/
|
|||||||
| `PICGO_API_KEY` | 可选,[PicoGo](https://www.picgo.net/)图床的API Key | `your-picogo-apikey` |
|
| `PICGO_API_KEY` | 可选,[PicoGo](https://www.picgo.net/)图床的API Key | `your-picogo-apikey` |
|
||||||
| `CLOUDFLARE_IMGBED_URL` | 可选,[CloudFlare](https://github.com/MarSeventh/CloudFlare-ImgBed) 图床上传地址 | `https://xxxxxxx.pages.dev/upload` |
|
| `CLOUDFLARE_IMGBED_URL` | 可选,[CloudFlare](https://github.com/MarSeventh/CloudFlare-ImgBed) 图床上传地址 | `https://xxxxxxx.pages.dev/upload` |
|
||||||
| `CLOUDFLARE_IMGBED_AUTH_CODE`| 可选,CloudFlare图床的鉴权key | `your-cloudflare-imgber-auth-code` |
|
| `CLOUDFLARE_IMGBED_AUTH_CODE`| 可选,CloudFlare图床的鉴权key | `your-cloudflare-imgber-auth-code` |
|
||||||
|
| `CLOUDFLARE_IMGBED_UPLOAD_FOLDER`| 可选,CloudFlare图床的上传文件夹路径 | `""` |
|
||||||
| **流式优化器相关** | | |
|
| **流式优化器相关** | | |
|
||||||
| `STREAM_OPTIMIZER_ENABLED` | 可选,是否启用流式输出优化 | `false` |
|
| `STREAM_OPTIMIZER_ENABLED` | 可选,是否启用流式输出优化 | `false` |
|
||||||
| `STREAM_MIN_DELAY` | 可选,流式输出最小延迟 | `0.016` |
|
| `STREAM_MIN_DELAY` | 可选,流式输出最小延迟 | `0.016` |
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ class Settings(BaseSettings):
|
|||||||
PICGO_API_KEY: str = ""
|
PICGO_API_KEY: str = ""
|
||||||
CLOUDFLARE_IMGBED_URL: str = ""
|
CLOUDFLARE_IMGBED_URL: str = ""
|
||||||
CLOUDFLARE_IMGBED_AUTH_CODE: str = ""
|
CLOUDFLARE_IMGBED_AUTH_CODE: str = ""
|
||||||
|
CLOUDFLARE_IMGBED_UPLOAD_FOLDER: str = ""
|
||||||
|
|
||||||
# 流式输出优化器配置
|
# 流式输出优化器配置
|
||||||
STREAM_OPTIMIZER_ENABLED: bool = False
|
STREAM_OPTIMIZER_ENABLED: bool = False
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ def _extract_image_data(part: dict) -> str:
|
|||||||
provider=settings.UPLOAD_PROVIDER,
|
provider=settings.UPLOAD_PROVIDER,
|
||||||
base_url=settings.CLOUDFLARE_IMGBED_URL,
|
base_url=settings.CLOUDFLARE_IMGBED_URL,
|
||||||
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
|
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
|
||||||
|
upload_folder=settings.CLOUDFLARE_IMGBED_UPLOAD_FOLDER,
|
||||||
)
|
)
|
||||||
current_date = time.strftime("%Y/%m/%d")
|
current_date = time.strftime("%Y/%m/%d")
|
||||||
filename = f"{current_date}/{uuid.uuid4().hex[:8]}.png"
|
filename = f"{current_date}/{uuid.uuid4().hex[:8]}.png"
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ class ImageCreateService:
|
|||||||
provider=settings.UPLOAD_PROVIDER,
|
provider=settings.UPLOAD_PROVIDER,
|
||||||
base_url=settings.CLOUDFLARE_IMGBED_URL,
|
base_url=settings.CLOUDFLARE_IMGBED_URL,
|
||||||
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
|
auth_code=settings.CLOUDFLARE_IMGBED_AUTH_CODE,
|
||||||
|
upload_folder=settings.CLOUDFLARE_IMGBED_UPLOAD_FOLDER,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
|
|||||||
@@ -1602,6 +1602,23 @@ endblock %} {% block head_extra_styles %}
|
|||||||
/>
|
/>
|
||||||
<small class="text-gray-500 mt-1 block">Cloudflare图床的认证码</small>
|
<small class="text-gray-500 mt-1 block">Cloudflare图床的认证码</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Cloudflare上传文件夹 -->
|
||||||
|
<div class="mb-6 provider-config" data-provider="cloudflare_imgbed">
|
||||||
|
<label
|
||||||
|
for="CLOUDFLARE_IMGBED_UPLOAD_FOLDER"
|
||||||
|
class="block font-semibold mb-2 text-gray-700"
|
||||||
|
>Cloudflare上传文件夹</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="CLOUDFLARE_IMGBED_UPLOAD_FOLDER"
|
||||||
|
name="CLOUDFLARE_IMGBED_UPLOAD_FOLDER"
|
||||||
|
placeholder=""
|
||||||
|
class="w-full px-4 py-3 rounded-lg form-input-themed"
|
||||||
|
/>
|
||||||
|
<small class="text-gray-500 mt-1 block">Cloudflare图床的上传文件夹路径(可选)</small>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 流式输出优化配置 -->
|
<!-- 流式输出优化配置 -->
|
||||||
|
|||||||
+16
-9
@@ -261,18 +261,20 @@ class PicGoUploader(ImageUploader):
|
|||||||
|
|
||||||
class CloudFlareImgBedUploader(ImageUploader):
|
class CloudFlareImgBedUploader(ImageUploader):
|
||||||
"""CloudFlare图床上传器"""
|
"""CloudFlare图床上传器"""
|
||||||
|
|
||||||
def __init__(self, auth_code: str, api_url: str):
|
def __init__(self, auth_code: str, api_url: str, upload_folder: str = ""):
|
||||||
"""
|
"""
|
||||||
初始化CloudFlare图床上传器
|
初始化CloudFlare图床上传器
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
auth_code: 认证码
|
auth_code: 认证码
|
||||||
api_url: 上传API地址
|
api_url: 上传API地址
|
||||||
|
upload_folder: 上传文件夹路径(可选)
|
||||||
"""
|
"""
|
||||||
self.auth_code = auth_code
|
self.auth_code = auth_code
|
||||||
self.api_url = api_url
|
self.api_url = api_url
|
||||||
|
self.upload_folder = upload_folder
|
||||||
|
|
||||||
def upload(self, file: bytes, filename: str) -> UploadResponse:
|
def upload(self, file: bytes, filename: str) -> UploadResponse:
|
||||||
"""
|
"""
|
||||||
上传图片到CloudFlare图床
|
上传图片到CloudFlare图床
|
||||||
@@ -288,12 +290,16 @@ class CloudFlareImgBedUploader(ImageUploader):
|
|||||||
UploadError: 上传失败时抛出异常
|
UploadError: 上传失败时抛出异常
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 准备请求URL(添加认证码参数,如果存在)
|
# 准备请求URL参数
|
||||||
|
params = []
|
||||||
|
if self.upload_folder:
|
||||||
|
params.append(f"uploadFolder={self.upload_folder}")
|
||||||
if self.auth_code:
|
if self.auth_code:
|
||||||
request_url = f"{self.api_url}?authCode={self.auth_code}&uploadNameType=origin"
|
params.append(f"authCode={self.auth_code}")
|
||||||
else:
|
params.append("uploadNameType=origin")
|
||||||
request_url = f"{self.api_url}?uploadNameType=origin"
|
|
||||||
|
request_url = f"{self.api_url}?{'&'.join(params)}"
|
||||||
|
|
||||||
# 准备文件数据
|
# 准备文件数据
|
||||||
files = {
|
files = {
|
||||||
"file": (filename, file)
|
"file": (filename, file)
|
||||||
@@ -388,6 +394,7 @@ class ImageUploaderFactory:
|
|||||||
elif provider == "cloudflare_imgbed":
|
elif provider == "cloudflare_imgbed":
|
||||||
return CloudFlareImgBedUploader(
|
return CloudFlareImgBedUploader(
|
||||||
credentials["auth_code"],
|
credentials["auth_code"],
|
||||||
credentials["base_url"]
|
credentials["base_url"],
|
||||||
|
credentials.get("upload_folder", ""),
|
||||||
)
|
)
|
||||||
raise ValueError(f"Unknown provider: {provider}")
|
raise ValueError(f"Unknown provider: {provider}")
|
||||||
|
|||||||
Reference in New Issue
Block a user