گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

دانلود راحت با قابلیت Resume بخصوص برای فایل های بزرگ بدون دخالت PHP

نویسنده:
۷ مهر ۹۴

خیلی مواقع برای دانلود فایل نیاز هست از طریق PHP و بدون در اختیار گذاشتن لینک مستقیم امکان دانلود را برای کاربر فراهم کنیم اینطوری :

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="PATH_TO_FILE"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: FILE_SIZE');
readfile("PATH_TO_FILE");
exit;

اما مشکل اون موقع پیش میاد که حجم فایل زیاد باشه و نیاز به resume باشه که البته اون را هم میشه با PHP حلش کرد و شاید یک نمونه را در آینده پُست کردم ولی راهکاری که میخوام براتون توضیح بدم به نظرم خیلی بهتره چون کل پروسه دانلود را میندازیم گردن Apache و کار خیلی تمیز تر و بهتر انجام میشه.

دانلود x-sendfile

در‌واقع میخوایم از ماژول x-sendfile که توی وب سرور های مختلف مثل apache و nginx و litespeed فرق میکنه استفاده کنیم. من فرض میکنم شما روی دبیان و وب سرور Apache میخواین نصبش کنید.

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

apt-get install apache2-dev

حالا سورس ماژول را از https://tn123.org/mod_xsendfile و بخش دانلود میگیریم و آرشیو را باز میکنیم و با دستور زیر ماژول را نصب میکنیم :
[doce]
sudo apxs -cia mod_xsendfile.c
[/code]
تا اینجا ماژول را نصب کردیم ولی باید برای سایت یا کل سرور فعال کنیم که میتونیم این کار را توی فایل httpd.conf یا apache2.conf یا از طریق htaccess. انجام بدین که من این آخری را ترجیح میدم. مثلاً دانلود را از طریق فایل xdownload.php انجام میدم پس توی htaccess. مینویسم :

<Files xdownload.php>
	XSendFile on
</Files>

آخرین کاری که باید انجام بدیم اینه که تعیین کنیم Apache برای Header های X-Sendfile به کدام دایرکتوری رجوع کنه که حتماً باید توی فایل‌های config سرور یا سایت این کار را انجام بدیم :

<VirtualHost *:80>
        ServerAdmin webmaster@domain.com
        ServerName www.domain.com
        DocumentRoot /path/to/www
        XSendFilePath /path/to/www/xdownload

	... other stuff
</VirtualHost>

همونطور که میبینید من برای سایتم یک دایرکتوری xdownload در نظر گرفتم و فایل‌هایی که میخوام دانلود کنم را میریزم توی اون دایرکتوری. شما با توجه سایت خودتون میتونید هر دایرکتوری را در نظر بگیرین.

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

sudo service apache2 restart

و با بهترین روش ممکن فایل را برای دانلود عرضه میکنیم :

header("X-Sendfile: xdownload/file.ext");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=file.ext");
exit;

اینکه اشاره کردم با دبیان انجام میدم برای این بود که دستور هایی مثل apt-get را با دبیان مینویسم وگرنه هیچ اهمیتی نداره از چه لینوکسی استفاده میکنید و فقط باید سرویس دهنده شما apache باشه.