PDA

View Full Version : سوال: دانلود مستقیم از سرور



Samira Reyhani
یک شنبه 23 شهریور 1393, 22:05 عصر
چطور میتونم کدی بنویسم که بشه یک فایل رو مستقیما دانلود کنم؟

prans.info
یک شنبه 23 شهریور 1393, 22:14 عصر
بیشتر توضیح بدید ...
با تابع کپی میتونید به راحتی فایل رو تویه هاست خودتون دانلود کنید :


copy ('http://site.com/filename.filetype','newname.filetype');

Samira Reyhani
یک شنبه 23 شهریور 1393, 22:20 عصر
نه میخوام بازدید کننده سایت بتونه از روی هاست دانلود کنه!!

Mohammadsgh
دوشنبه 24 شهریور 1393, 00:15 صبح
خب اگه لینک رو معمولی به فایل بدید کاربر میتونه دانلود کنه

Unique
دوشنبه 24 شهریور 1393, 11:05 صبح
خانم ریحانی ، تا زمانی که سوالی را کامل و با توضیحات مناسبی نپرسین قطعا جواب درست و حسابی هم نمیگیرین !
بعضی کلمات مفاهیم دو پهلو ایجاد میکنند ! مثلا شما گفتین "بشه مستقیم دانلود کنه" !

علاوه بر اینکه اصلا نگفتین این فایل به صورت استاتیک روی سایت هست یا توسط PHP به صورت دینامیک ایجاد میشه ، نمیشه فهمید مستقیم دقیقا یعنی چی ؟ مثلا اگه فایل دینامیک ایجاد میشه منظور از مستقیم اینه که فایل را PHP برای کاربر بفرسته ! یا مثلا جایی ذخیره کنه و مثل لینک مستقیم وب سرور ارسال کنه !

امیدوارم متوجه اشتباهتون توی سوال کردن شده باشین و امیدوارم از ایراد گرفتن من هم دلخور نشده باشین چون انقدر که آدم از سوال کردن یاد میگیره از مطالعه کردن یاد نمیگیره (نظر کاملا شخصی).

اما پاسخ شما :

۱ - اگه فایل شما به صورت استاتیک روی هاست موجوده که یا باید توی صفحه لینک مستقیم بدین و وب سرور خودش عملیات دانلود را انجام میده !
۲ - اگه فایل روی وب سرور به صورت استاتیک موجوده و یا توسط php ایجاد میشه و دلیلی نداره مسیرش را از کاربر مخفی کنیم میشه با تابع header بهش redirect کرد :

header("Location: /downloads/file.zip");
۳ - اگه فایل توسط PHP به صورت دینامیک ایجاد میشه یا استاتیک وجود داره و باید مسیرش مخفی بمونه و توسط برنامه برای کاربر ارسال بشه اینطوری :

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Content-Length: ' . filesize($file_name));
readfile($this->filename);

توجه : البته Content-Type و header های دیگه بسته به نوع فایل میتونه متفاوت بشه که باید تجربه به دست بیارین !
نکته : برای قابلیت resume هم باید range ها را توی Header تشخیص بدین و دنگ و فنگ داره و توی گوگل جستجو کنید توابعی برای این کار هست.
نکته : Apache یک mod داره به نام X-Sendfile که روی سرور های دیگه به نام های دیگه هم وجود داره و میشه به جای ارسال از طریق کد PHP و درگیری با resume و مشکلات دیگه مثل ارسال از طریق وب سرور با x-sendfile همه کار را بندازیم روی دوش وب سرور که این مورد برای فایل های بزرگ بهترین انتخابه اما کانفیگ کردن x-sendfile بسته به هاست شما و تجربشون ممکنه دردسرهایی داشته باشه.

موفق و پیروز باشین.