حداکثر اندازهٔ فایل قابل آپلود در File Manager و گرفتن لینک دانلود

حداکثر اندازهٔ فایل قابل آپلود در File Manager و گرفتن لینک دانلود

پرسش «حداکثر اندازهٔ فایلی که می‌توانم از طریق File Manager آپلود کنم چقدر است؟» یک پاسخ عددی ثابت ندارد، اما مهم‌تر از آن، بیشتر راهنماهایی که در فارسی و انگلیسی پیدا می‌کنید به این پرسش پاسخ غلط می‌دهند: آن‌ها سراغ upload_max_filesize و post_max_size سایت شما می‌روند، در حالی که این مقادیر روی آپلود از داخل خود کنترل‌پنل اثری ندارند. دو سقف کاملاً جدا در کار است؛ یکی را مدیر سرور تعیین می‌کند و دیگری را تنظیمات PHP دامنهٔ شما. پایین‌تر هم می‌بینیم فایلی که با File Manager آپلود شده، برای اینکه اصلاً لینک دانلود بگیرد باید کجا قرار داشته باشد.

دو سقف مجزا که مدام با هم اشتباه گرفته می‌شوند

وقتی فایلی را در مرورگر آپلود می‌کنید، بسته به اینکه آن فرم آپلود کجا اجرا می‌شود، دو مسیر کاملاً متفاوت وجود دارد:

  • آپلود از داخل کنترل‌پنل (File Manager در cPanel یا DirectAdmin، و همچنین phpMyAdmin‌ای که از خود کنترل‌پنل باز می‌شود): این صفحه‌ها روی وب‌سرورِ خودِ کنترل‌پنل و روی پورت‌های اختصاصی آن اجرا می‌شوند، نه روی وب‌سایت شما. سقفشان را مدیر سرور تعیین می‌کند و تنظیمات PHP دامنهٔ شما هیچ اثری بر آن ندارد.
  • آپلود از داخل سایت خودتان (کتابخانهٔ رسانهٔ وردپرس، فرم آپلود یک اسکریپت یا افزونه، آپلودر نرم‌افزاری که خودتان روی دامنه نصب کرده‌اید): این مسیر تابع تنظیمات PHP همان دامنه و سقف بدنهٔ درخواست در وب‌سرور است. این همان جایی است که upload_max_filesize واقعاً حرف اول را می‌زند.

اگر این تفکیک را نادیده بگیرید، ساعت‌ها php.ini را دستکاری می‌کنید و می‌بینید File Manager هنوز همان فایل را رد می‌کند. دلیلش خرابی سرویس نیست؛ سراغ تنظیم اشتباهی رفته‌اید.

سقف File Manager را چه چیزی تعیین می‌کند

در cPanel، رابط کاربری روی سرویس داخلی کنترل‌پنل و پورت‌هایی مثل 2082 و 2083 سرو می‌شود. سقف آپلود آن در WHM و در بخش Tweak Settings با گزینه‌ای به نام Max HTTP submission size تعیین می‌شود. مقادیر مربوط به PHP داخلی کنترل‌پنل هم جدا از PHP سایت شماست و روی ابزارهایی مثل phpMyAdmin اثر می‌گذارد؛ به همین دلیل بالا بردن upload_max_filesize دامنه، سقف ایمپورت فایل SQL در phpMyAdmin کنترل‌پنل را هم جابه‌جا نمی‌کند. هیچ‌کدام از این‌ها از داخل حساب کاربری قابل تغییر نیستند. برای یک دیتابیس حجیم، اگر به خط فرمان دسترسی دارید ایمپورت با کلاینت mysql راه مطمئن‌تری است و روی هاست اشتراکی باید از پشتیبانی کمک بگیرید.

در DirectAdmin هم File Manager توسط سرویس خود کنترل‌پنل روی پورت 2222 ارائه می‌شود و مقدار آن در مسیر Server Manager و سپس Administrator Settings با گزینهٔ Max Request / Upload Size تنظیم می‌گردد؛ این تنظیم سطح سرور است و برای همهٔ کاربران اعمال می‌شود.

در راهنماهای قدیمی دایرکت‌ادمین عدد مشخصی مثل «۴۸ مگابایت» به‌عنوان سقف آپلود File Manager نقل شده است. این عدد یک قاعدهٔ عمومی نیست و نباید آن را برای سرور خودتان فرض بگیرید؛ صرفاً مقداری بوده که مدیرِ آن سرور در همان تنظیم بالا گذاشته بود. روی سرور شما ممکن است این عدد بسیار بیشتر یا کمتر باشد.

نتیجهٔ عملی برای کاربر هاست اشتراکی روشن است: اگر فایلی از سقف File Manager بزرگ‌تر است، تغییر تنظیمات PHP دردی دوا نمی‌کند. یا باید از مدیر سرویس بخواهید مقدار را بالا ببرد، یا از راه درست‌تر یعنی FTP و SFTP استفاده کنید. روی سرویس‌هایی مانند هاست لینوکس ایران با کنترل‌پنل cPanel این مقدار را مدیر سرور تنظیم کرده است و برای اطلاع از عدد دقیق باید از پشتیبانی بپرسید؛ حدس زدن آن از روی راهنماهای عمومی اینترنت کار درستی نیست چون از سروری به سرور دیگر فرق می‌کند.

فایل را آپلود کردید؛ لینک دانلودش کجاست؟

پرکاربردترین کاری که با File Manager انجام می‌شود این است که یک فایل (تصویر، PDF، آرشیو یا فایلی که می‌خواهید برای کسی بفرستید) آپلود شود و بعد دنبال آدرس مستقیم آن بگردید. قاعدهٔ اصلی این است: فقط فایل‌هایی از طریق مرورگر قابل دسترسی‌اند که داخل ریشهٔ سند دامنه، یعنی پوشهٔ public_html، قرار داشته باشند. هر چیزی که بیرون از این پوشه آپلود کنید روی دیسک سرور هست، اما وب‌سرور آن را سرو نمی‌کند و با هیچ آدرسی باز نمی‌شود.

مسیر این پوشه در دو کنترل‌پنل رایج یکسان نیست:

  • DirectAdmin: /home/USERNAME/domains/example.com/public_html/
  • cPanel، برای دامنهٔ اصلی: /home/USERNAME/public_html/

روال کار در DirectAdmin ساده است: وارد File Manager شوید، وارد public_html بروید، در صورت نیاز با گزینهٔ ساخت پوشه (Create New Folder) پوشه‌ای مثلاً به نام files بسازید، داخل آن شوید و فایل را آپلود کنید. توجه داشته باشید که پوستهٔ پیش‌فرض امروزی دایرکت‌ادمین (Evolution) با تصویرهای راهنماهای قدیمی که بر اساس پوستهٔ Enhanced نوشته شده‌اند یکی نیست؛ نام گزینه‌ها و جای دکمه‌ها تغییر کرده، ولی منطق کار همان است.

تبدیل مسیر فایل روی دیسک به آدرس اینترنتی یک قاعدهٔ ثابت دارد: هر چیزی تا public_html و خودِ public_html را از ابتدای مسیر حذف کنید و به‌جای آن نام دامنه را بگذارید. خط اول مسیر فایل روی سرور است و خط دوم آدرس دانلودی که از آن ساخته می‌شود:

/home/username/domains/example.com/public_html/files/1.jpg
https://example.com/files/1.jpg

چند نکته که بیشترین خطای 404 و 403 را در همین مرحله می‌سازد:

  • عبارت public_html نباید در لینک بیاید. example.com/public_html/files/1.jpg همیشه ۴۰۴ می‌دهد.
  • لینوکس به بزرگی و کوچکی حروف حساس است؛ File.JPG با file.jpg دو فایل متفاوت‌اند.
  • نام فایل فارسی یا دارای فاصله در مرورگر به شکل کدشده (درصددار) درمی‌آید و در پیام‌رسان‌ها خراب می‌شود؛ نام‌های انگلیسی بدون فاصله بگذارید.
  • سطح دسترسی فایل باید خواندنی باشد (معمولاً 644) و پوشه‌ها 755. اگر بعد از آپلود دسترسی را دستی عوض کرده‌اید، همین می‌تواند دلیل ۴۰۳ باشد.
  • باز کردن خودِ پوشه در مرورگر ممکن است ۴۰۳ بدهد، چون فهرست‌کردن محتوای پوشه (directory listing) روی بیشتر سرورها غیرفعال است؛ این ربطی به لینک مستقیم فایل ندارد و لینک فایل کار می‌کند.
  • ساب‌دامین‌ها و دامنه‌های اضافه ریشهٔ سند جداگانه دارند؛ مسیر دقیق آن‌ها را از خود کنترل‌پنل بخوانید و همان را مبنای ساخت لینک قرار دهید.

یک نکتهٔ رفتاری هم بدانید: تصویر، PDF و فایل متنی به‌طور پیش‌فرض در خود مرورگر باز می‌شوند و دانلود نمی‌شوند؛ این طبیعی است. آرشیوهایی مثل zip معمولاً مستقیم دانلود می‌شوند. اگر می‌خواهید همه چیز حتماً دانلود شود، باید هدر Content-Disposition: attachment برای آن مسیر تنظیم شود که کار سمت وب‌سرور است.

سقف آپلود سایت خودتان: قانون کوچک‌ترین مقدار

برای هر فرم آپلودی که داخل سایت شما اجرا می‌شود، سقف واقعی برابر است با کوچک‌ترین مقدار میان چند تنظیم مستقل. اگر فقط یکی از آن‌ها را بالا ببرید، عملاً هیچ اتفاقی نمی‌افتد:

تنظیم چه چیزی را محدود می‌کند
upload_max_filesize بزرگ‌ترین حجم مجاز برای یک فایل. پیش‌فرض خود PHP فقط 2M است.
post_max_size بزرگ‌ترین حجم مجاز برای کل بدنهٔ درخواست POST. پیش‌فرض PHP 8M است.
memory_limit سقف حافظهٔ اسکریپت. در آپلود ساده معمولاً گلوگاه نیست (پایین‌تر توضیح داده‌ایم).
max_input_time مهلت دریافت و تجزیهٔ داده‌های ورودی، یعنی زمانی که فایل در حال رسیدن به سرور است.
max_execution_time مهلت اجرای اسکریپت پس از دریافت کامل فایل.
سقف وب‌سرور محدودیت مستقل Apache، LiteSpeed یا Nginx روی اندازهٔ بدنهٔ درخواست.

پیام «Maximum upload file size» که در کتابخانهٔ رسانهٔ وردپرس می‌بینید دقیقاً حاصل همین مقادیر است و راه‌حل آن نصب افزونه نیست، بلکه اصلاح همین تنظیم‌هاست. روی سرویس‌هایی مثل هاست وردپرس ایران که با cPanel ارائه می‌شوند، این مقادیر معمولاً از بخش تنظیمات PHP کنترل‌پنل قابل ویرایش‌اند.

قانون کلیدی: post_max_size باید از upload_max_filesize بزرگ‌تر باشد

این رایج‌ترین اشتباه است. مرورگر فایل را در قالب یک درخواست multipart/form-data می‌فرستد که علاوه بر خود فایل، فیلدهای فرم، توکن امنیتی و مرزهای multipart را هم شامل می‌شود. اگر upload_max_filesize را روی 512M بگذارید ولی post_max_size روی 8M بماند، PHP کل درخواست را پیش از رسیدن به کد دور می‌اندازد و شما فقط یک صفحهٔ خالی یا آرایهٔ $_FILES خالی می‌بینید، بدون هیچ پیام خطای مفیدی.

قاعدهٔ عملی: post_max_size را دست‌کم کمی بزرگ‌تر از upload_max_filesize بگذارید. اگر می‌خواهید چند فایل هم‌زمان آپلود شود، باید مجموع آن‌ها زیر post_max_size بماند.

دربارهٔ memory_limit یک توصیهٔ قدیمی را کنار بگذارید

سال‌ها گفته می‌شد memory_limit باید از حجم فایل بزرگ‌تر باشد. این حرف امروز عمومیت ندارد: PHP فایل آپلودی را در حافظه نگه نمی‌دارد، بلکه آن را جریانی روی دیسک در مسیر upload_tmp_dir می‌نویسد. بنابراین آپلود یک فایل ۵۰۰ مگابایتی با memory_limit برابر 128M کاملاً ممکن است.

memory_limit تنها وقتی اهمیت پیدا می‌کند که برنامه‌ای فایل را با توابعی مثل file_get_contents() یکجا بخواند، تصویر را پردازش کند یا آرشیو را در حافظه باز کند.

لایهٔ پنهان: سقف خود وب‌سرور

حتی وقتی PHP اجازه می‌دهد، ممکن است وب‌سرور جلوی درخواست را بگیرد و خطای 413 Request Entity Too Large برگردد. این محدودیت‌ها در PHP نیستند:

  • Apache: دستور LimitRequestBody
  • Nginx: دستور client_max_body_size که پیش‌فرض آن فقط 1m است
  • LiteSpeed: گزینهٔ Max Request Body Size در بخش Tuning

اگر Nginx جلوی Apache به‌عنوان پروکسی نشسته باشد، باید مقدار را روی هر دو لایه بالا ببرید، وگرنه لایهٔ جلویی درخواست را همان اول رد می‌کند.

یک نکتهٔ مهم دربارهٔ LiteSpeed: این وب‌سرور فایل‌های .htaccess آپاچی را می‌خواند، به همین دلیل خیلی‌ها تصور می‌کنند سقف بدنهٔ درخواست را هم می‌شود از همان‌جا عوض کرد. در عمل این مقدار در پیکربندی خود LiteSpeed نگهداری می‌شود و تغییر آن دسترسی مدیر سرور می‌خواهد. روی هاست اشتراکی تنها راه، درخواست از پشتیبانی است.

چطور مقدار فعلی سایت خود را ببینیم

ساده‌ترین راه، ساختن یک فایل موقت مثل info.php در ریشهٔ سایت با محتوای <?php phpinfo(); و باز کردن آن در مرورگر است. مقدار ستون Local Value را بخوانید، نه Master Value. پس از بررسی حتماً فایل را حذف کنید، چون اطلاعات زیادی از سرور را لو می‌دهد.

روی دسترسی خط فرمان هم این دستورها کمک می‌کنند، به شرطی که حواستان باشد نسخهٔ CLI ممکن است php.ini متفاوتی با نسخهٔ وب داشته باشد:

php -i | grep -E "upload_max_filesize|post_max_size|memory_limit|max_input_time"
php --ini

دستور دوم مسیر دقیق فایل پیکربندی نسخه‌ای را که واقعاً اجرا می‌شود نشان می‌دهد.

تغییر مقادیر روی هاست اشتراکی

در cPanel از بخش MultiPHP INI Editor و در DirectAdmin از بخش انتخاب نسخهٔ PHP و تنظیمات آن استفاده کنید. اگر این گزینه‌ها در دسترس نبودند، یک فایل .user.ini در ریشهٔ سایت بسازید:

upload_max_filesize = 256M
post_max_size = 260M

توجه کنید که PHP این فایل را کش می‌کند و طبق مقدار پیش‌فرض user_ini.cache_ttl تا ۳۰۰ ثانیه طول می‌کشد تا تغییر اعمال شود. یادآوری دوباره: هیچ‌کدام از این‌ها سقف File Manager کنترل‌پنل را جابه‌جا نمی‌کند.

اگر مرتب به سقف‌های سطح سرور برمی‌خورید ولی نمی‌خواهید خودتان درگیر پیکربندی سرور شوید، سرور مجازی مدیریت‌شدهٔ ایران حد وسط منطقی است؛ در این سرویس نصب و پیکربندی کنترل‌پنل بر عهدهٔ تیم فنی است و کافی است مقدار دلخواه را درخواست کنید.

یک روش منسوخ‌شده را هم کنار بگذارید: نوشتن php_value upload_max_filesize 256M در .htaccess فقط زمانی کار می‌کرد که PHP به‌صورت ماژول Apache اجرا می‌شد. روی سرورهای امروزی که PHP را با PHP-FPM یا به‌صورت CGI اجرا می‌کنند، همین یک خط باعث خطای 500 Internal Server Error در کل سایت می‌شود.

تغییر مقادیر روی سرور مجازی یا اختصاصی

وقتی خودتان مدیر سرور هستید، مسیر فایل پیکربندی را با php --ini پیدا کنید، مقادیر را ویرایش کنید و سرویس را ریست کنید. نام سرویس بسته به نسخه و توزیع فرق می‌کند؛ دستورهای قدیمی مثل service php-fpm restart یا /etc/init.d/php-fpm restart امروز جای خود را به systemd داده‌اند:

# AlmaLinux / Rocky Linux / CentOS
systemctl restart php-fpm

# Ubuntu / Debian
systemctl restart php8.4-fpm

شمارهٔ نسخه را مطابق سرور خودتان بگذارید. اگر روی سرور کنترل‌پنل نصب است نام سرویس فرق می‌کند و دستور بالا خطای «Unit not found» می‌دهد؛ در cPanel هر نسخهٔ PHP سرویس جداگانهٔ خودش را دارد (مثل ea-php84-php-fpm) و امن‌ترین کار ریستارت از خود WHM است. برای دیدن نام دقیق سرویس روی سرورتان:

systemctl list-units --type=service | grep -i fpm

سپس اگر Nginx دارید client_max_body_size را هم تنظیم کنید، با nginx -t صحت پیکربندی را بررسی و در آخر با systemctl reload nginx اعمالش کنید؛ تا وقتی reload نکرده‌اید مقدار جدید هیچ اثری ندارد و فقط روی کاغذ عوض شده است. ترتیب را رعایت کنید: هرگز پیش از تأیید nginx -t سرویس را reload یا restart نکنید، چون یک خطای تایپی در فایل پیکربندی می‌تواند وب‌سرور را بالا نیاورد و کل سایت‌های سرور را از دسترس خارج کند. روی سروری که کنترل‌پنل روی آن نصب است، برخلاف یک حساب کاربری معمولی، به‌عنوان مدیر به تنظیمات سطح سرور از جمله سقف آپلود خود کنترل‌پنل هم دسترسی دارید و همان گزینه‌های Tweak Settings یا Administrator Settings که بالاتر نام بردیم در اختیارتان است.

چرا برای فایل‌های واقعاً بزرگ باید سراغ FTP یا SFTP رفت

حتی اگر همهٔ اعداد را بالا ببرید، آپلود از طریق مرورگر برای فایل‌های چند گیگابایتی ابزار مناسبی نیست. یک قطعی لحظه‌ای اینترنت یعنی شروع دوباره از صفر، چون آپلود HTTP در فرم‌های ساده قابل ازسرگیری نیست. در مقابل، پروتکل‌های انتقال فایل:

  • نه به PHP سایت کار دارند و نه به سرویس کنترل‌پنل، پس هیچ‌کدام از سقف‌های بالا روی آن‌ها اعمال نمی‌شود
  • در نرم‌افزارهایی مثل FileZilla و WinSCP قابلیت ازسرگیری انتقال ناقص را دارند
  • برای انتقال پوشه‌های حجیم و چند هزار فایلی به‌مراتب سریع‌ترند

قاعدهٔ ساده‌ای که پیشنهاد می‌کنیم: هر چیز بزرگ‌تر از چند ده مگابایت را با SFTP یا FTP بفرستید، نه با File Manager. فقط یادتان باشد که برای گرفتن لینک دانلود، فایل باید با FTP هم داخل همان public_html بنشیند؛ اگر آن را در پوشهٔ خانگی کاربر رها کنید، از طریق مرورگر باز نخواهد شد. اگر کارتان اساساً میزبانی و توزیع فایل‌های سنگین است، سرویسی که برای همین ساخته شده مثل هاست دانلود با اکانت FTP نامحدود انتخاب درست‌تری از یک هاست عمومی است.

جمع‌بندی

پیش از هر انتقال بزرگ، فایل‌ها را در یک آرشیو zip جمع کنید، آن را منتقل کنید و از قابلیت Extract خود کنترل‌پنل برای باز کردنش استفاده کنید؛ این کار هم سریع‌تر است و هم احتمال نیمه‌کاره ماندن انتقال را کم می‌کند.

خلاصهٔ کل ماجرا در چند جمله: عدد جادویی وجود ندارد و مهم‌تر اینکه دو سقف متفاوت در کارند. سقف File Manager را مدیر سرور در تنظیمات خود کنترل‌پنل تعیین می‌کند و از داخل حساب شما قابل تغییر نیست؛ سقف آپلودهای داخل سایت برابر است با کمترین مقدار میان upload_max_filesize، post_max_size و محدودیت بدنهٔ درخواست در وب‌سرور. اول تشخیص دهید با کدام‌یک طرف هستید، بعد سراغ تنظیمات بروید، برای هر چیز حجیم ابزار درست یعنی SFTP را انتخاب کنید و برای اینکه فایل لینک دانلود بگیرد، آن را داخل public_html بگذارید و در ساخت آدرس، همین بخش را از مسیر حذف کنید.