fix(media): سقف آپلود ۱۰→۲۵ مگابایت (لبه ۳۰MB) + پیام مشخص ۴۱۳ و پیش‌چک حجم سمت کاربر — فایل‌های بزرگ تیم محتوا در لبه رد می‌شدند

This commit is contained in:
aramesh-site deploy
2026-09-30 10:37:30 +00:00
parent d2ed1b1c76
commit 30038d5103
2 changed files with 14 additions and 4 deletions
+2 -1
View File
@@ -26,7 +26,8 @@ class Settings(BaseSettings):
s3_bucket: str = "aramesh-media"
# پیشوند عمومی مسیر تصاویر — Traefik آن را به باکت پروکسی می‌کند
media_public_base: str = "/media"
media_max_upload_mb: int = 10
# رندرهای معماری حجیم‌اند — لبه (Traefik api-bodylimit) باید همیشه بزرگ‌تر از این باشد
media_max_upload_mb: int = 25
# نشانی کامل سایت (مثل https://aramesh.example) — برای sitemap و آدرس مطلق OG
site_url: str = ""
+9
View File
@@ -3,6 +3,9 @@ import { API_URL } from '../config'
const TOKEN_KEY = 'aramesh_admin_token'
/** سقف آپلود — هم‌اندازهٔ media_max_upload_mb بک‌اند (تنظیمات) */
const MAX_UPLOAD_BYTES = 25 * 1024 * 1024
/** رویداد تغییر وضعیت ورود — لایه‌های دیگر (مثل نوار ادمین) با آن همگام می‌مانند */
export const AUTH_CHANGE_EVENT = 'aramesh:auth-change'
@@ -43,6 +46,8 @@ async function authFetch<T>(path: string, options: RequestInit = {}): Promise<T>
const detail =
typeof data?.detail === 'string'
? data.detail
: res.status === 413
? 'حجم فایل بیش از حد مجاز است (حداکثر ۲۵ مگابایت)'
: res.status === 409
? 'رکوردی با این مقدار تکراری وجود دارد'
: 'خطا در ذخیره‌سازی — دوباره تلاش کنید'
@@ -88,6 +93,10 @@ export const adminApi = {
authFetch<T[]>(`/api/admin/${resource}/reorder`, { method: 'POST', body: JSON.stringify({ ids }) }),
upload: async (file: File, name?: string): Promise<{ url: string; key: string }> => {
// پیش‌چک سمت کاربر — خطای ۴۱۳ لبه/CDN به‌صورت صفحه HTML می‌رسد و پیام خاص از دست می‌رود
if (file.size > MAX_UPLOAD_BYTES) {
throw new HttpError(413, 'حجم فایل بیش از ۲۵ مگابایت است — فایل را کوچک‌تر کنید')
}
const fd = new FormData()
fd.append('file', file)
if (name && name.trim()) fd.append('name', name.trim())