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
+12 -3
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,9 +46,11 @@ async function authFetch<T>(path: string, options: RequestInit = {}): Promise<T>
const detail =
typeof data?.detail === 'string'
? data.detail
: res.status === 409
? 'رکوردی با این مقدار تکراری وجود دارد'
: 'خطا در ذخیره‌سازی — دوباره تلاش کنید'
: res.status === 413
? 'حجم فایل بیش از حد مجاز است (حداکثر ۲۵ مگابایت)'
: res.status === 409
? 'رکوردی با این مقدار تکراری وجود دارد'
: 'خطا در ذخیره‌سازی — دوباره تلاش کنید'
throw new HttpError(res.status, detail)
}
return res.status === 204 ? (null as T) : ((await res.json()) as T)
@@ -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())