آخرین نوشته ها

image post

Force Download فایل های حجیم در php با ماژول Xsendfile Apache

برای force download و مخفی کردن آدرس اصلی فایل بر روی سرور و ایجاد لینک های دارای تاریخ مصرف معمولا فایل مورد نظر را از طریق یک فایل php بایت بایت میخوانند و به سمت کاربر ارسال میکنند یا به اصطلاح stream میکنند این مورد با کمک تابع fread انجام میشود , با اینکه در سایت php.net بیان شده استفاده از این تابع مشکلی برای ram پیش نمیاورد اما پیشنهاد میشود برای فایل های بزرگ از ماژول xsendfile وب سرور آپاچی استفاده نمایید !

برای دانلود ماژول مورد نظر به سایت رسمی آن مراجعه نمایید :

XsendFile Website

پس از دانلود سورس از وب سایت بالا باید فایل را compile و نصب نمایید :

apxs -cia mod_xsendfile.c

اگر apxs را بر روی لینوکس نصب نداشته باشید باید با دستور زیر نصب نمایید :

sudo apt install apache2-dev

حال با دستور زیر در ترمینال وب سرور را restart نمایید :

sudo service apache2 restart

اکنون ماژول با موفقیت نصب شده است !

به دلایل امنیتی شما نمیتوانید فایل ها را از هر قسمتی از سیستم توسط xsendfile دریافت نمایید باید در httpd.conf از دستور زیر برای مشخص کردن محل قرار گیری فایل ها استفاده نمایید (توجه داشته باشید به دلایل امنیتی تنظیمات ماژول فقط در فایل تنظیمات اصلی وب سرور انجام میشود و در فایل .htaccess کار نمی کند ) :

XSendFilePath "/home/EXAMPLE_WEB_LOCATION/"

تنظیمات بالا به ماژول اجازه می دهد تا فایل ها را از مسیر بالا و زیر دایرکتوری های ان serve کند !

پس از تنظیم وب سرور میتوانید با نمونه کد زیر header های ماژول رو برای وب سرور ارسال نمایید تا فایل مورد نظر دانلود شود :

header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;

در کد بالا متغیر $path_to_somefile شامل مسیر فایل در سرور و $somefile نام فایل برای کاربر می باشد

موفق باشید

0 دیدگاه

ارسال دیدگاه جدید

دنیس ریچی : یونیکس بسیار ساده هست، تنها یک نابغه باید باشید تا بتوانید سادگی آن را درک کنید.