ایجاد لینک دانلود غیر مستقیم با PHP

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

روش کلی برای ایجاد لینک های دانلود غیر مستقیم با استفاده از PHP به این صورت هست که محتوای فایل رو توی صفحه echo میکنیم. به کد زیر توجه کنید:

در کدهای بالا ابتدا یه تابع تعریف کردم که وظیفه ی فرستادن فایل به دانلود رو به عهده داره. نحوه کار به این صورته که آدرس فایل رو به تابع میدیم و فایل برای دانلود ارسال میشه. اگه فایل بنا به هر دلایلی وجود نداشته باشه با صفحه ۴۰۴ مواجه خواهید شد. در این روش کل فایل رو به صورت یکجا به خروجی فرستادم تا کاربر بتونه عمل دانلود رو انجام بده. این روش یه ایرادی داره و ایرادش این هست که در هنگام ارسال فایل های بزرگ به سمت کاربر با مشکل منابع رم رو به رو خواهید شد. خب ما برای اینکه بتونیم برای فایل های حجیم لینک دانلود غیر مستقیم ایجاد کنیم میتونیم فایل رو تیکه تیکه به خروجی بفرستیم. همچنین میتونیم سرعت دانلود رو هم برای فایل محدود کنیم. به مثال زیر دقت کنید:

یه تابع تعریف کردم که دوتا پارامتر میگیره. پارامتر اول آدرس فایل و پارامتر دوم سرعت دانلود به کیلوبایت خواهد بود. توی این تابع فایل رو به صورت تیکه تیکه برای دانلود به خروجی میفرستم و اندازه ی هر تیکه از فایل رو با متغییر speed تعیین میکنم. این متغییر مشخص میکنه که توی هر ثانیه چه مقداری از فایل به خروجی فرستاده بشه. مثلا اگه توی هر ثانیه ۱۰۰ کیلوبایت برای دانلود به خروجی فرستاده بشه سرعت دانلود ما برابر با ۱۰۰kb/s خواهد بود. برای ایجاد وقفه زمانی بین ارسال تیکه های فایل از دستور sleep استفاده کردم که زمان رو بر حسب ثانیه بهش میدیم و توی اون مدت زمان عمل وقفه رو انجام میده. 😀

روش هایی وجود داره که بشه قابلیت resume رو به دانلود فایل داد . این روش خیلی پیشرفته هست در صورت نیاز میتونید مطرح کنید تا روش رو شرح بدم براتون. 😐

به اشتراک بگذارید:Email this to someoneShare on FacebookTweet about this on TwitterShare on Google+Digg thisShare on LinkedInPin on PinterestShare on StumbleUponFlattr the authorShare on RedditBuffer this pageShare on TumblrPrint this pageShare on YummlyShare on VK
  1. خیلی جالبه
    ولی به نظرم یه راه دیگه هم میشه استفاده کرد
    آدرس فایل رو توی یه سایت که آدرس رو کوچیک میکنه بذاری و لینک کوتاه شده رو و اونوقت دیگه آدرس فایل اصلی رو کسی نداره …

    • اره با این روش هم میشه ولی دیگه نمیتونیم کنترلی روی لینکی که به شخص مورد نظر دادیم داشته باشیم . مثلا نمیتونیم برای لینک دانلود یه بازه زمانی تعیین کنیم. توی سایتای بزرگ حتی برای دانلود فایل باید یه حق عضویت پرداخت بشه که با این روش که گفتم قابل پیاده سازیه

  2. سلام، ممنون از مطالب پر محتوا و کاربردی شما، سوالی درباره این آموزش داشتم، آیا میشه که لینک مستقیم از سایتهای آپلود رایگان رو از این طریق مخفی کرد ؟ ممنون میشم راهنمایی فرمایید. بسیار نیازمندم

    • بعله میشه ولی نحوه کار فرق داره برای لینک های خارجی باید اول فایل رو توی هاست خودمون بیاریم و بعدش برای کاربر ارسال کنیم تا دانلود کنه. این اوردن فایل به سایت خودمون میتونه با دستور file_get_contents انجام بشه. موفق باشید.

      • من داخل نت راجب کدی که فرمودید جستجو کردم،اما فضای هاستم این اجازه رو نمیده و اینکه ممکنه چندتا دانلود همزمان باشه و فشار زیادی وارد بشه. من فضای هاستم کمه و دارم فروشکاه اینترنتی با edd راه میندازم، چون افزونه edd تنها از فایلهای مربوط به پوشه خودش در هاست محافظت میکنه. من میخوام فایلارو در پیکو فایل آپلود کنم اما مشتری فقط بتونه دانلود کنه و به آدرس فایل دسترسی نداشته باشه که دفعات بعد نتونه دانلودش کنه.
        اصلا همچین کاری شدنی هست ؟
        خود edd افزونه پولی دارد که البته خیلی گرونه.

        • میتونید یه کار جالبی انجام بدید اونم به این صورت که مثلا ۴ کیلوبایت از فایل رو بخونید و بفرستید برای دانلود و در مرحله بعد باز ۴ کیلوبایت رو بخونید و دوباره بفرستید برای دانلود 😀 در این صورت به جای اینکه کل فایل رو یکجا بخونید (مثلا فایل شما اگه ۱۰ گیگ باشه اگه بخواید کل فایل رو یکجا بخونید و سپس بفرستید برای دانلود ۱۰ گیگ از هاست شما تا انتهای عمل دانلود توسط یوزر اشغال خواهد شد) عمل خوندن رو به صورت چند کیلوبایتی انجام بدید تا فایل کاملا توسط یوزر دانلود بشه , در این حالت به هاست شما هم فشار نمیاد و همچنین فضای هاست شما نیز حروم نمیشه. اگه مشکلی داشتید بگید. اینم از راه حل من 😀

          • اینم روش جالبی میشه عزیزم، اما من کدی ندارم اینکارو کنم. ممنون میشم اگه چیزی داشتید با ذکر یه مثال ذکر فرمایید.
            خیلی خیلی ممنون

          • یکی دو روز صبر کنید کدشو براتون بنویسم. از افزونه ی wp-filebase نیز میتونید استفاده کنید. موفق باشید.

          • ادمین محترم ممنونم، چشم ما منتظر خواهیم ماند. متاسفانه wp-filebase بکارم نیومد

          • من بررسی کردم متاسفانه نمیشه که فایل رو به صورت پارت به پارت با PHP خوند و همزمان اون رو به دانلود فرستاد! شما تنها راهی که دارید این هست که فایل رو ابتدا کاملا دانلود کنید و روی هاست خود قرار بدید و سپس برای دانلود ارسال کنید و بعد از یه مدت زمان معین فایل رو پاک کنید تا فضای گرفته شده دوباره ازاد بشه.
            میتونید از هاست دانلود استفاده کنید که قیمت کمتری نسبت به هاست های دیگه داره.

  3. مرتضی

    با سلام و خسته نباشید.
    چظور میتونیم از این روش برای فایلهایی که در هاست دانلود قرار دادیم استفاده کنیم ؟

    • این سورس رو درون هاست دانلود خود قرار بدید ولی برای قسمت یوزر و پسوورد یه فایل روی هاست اصلی بسازید , توی قسمت چک کردن یوزر پسوورد اون رو برای هاست اصلی بفرستید اگه توی دیتابیس هاست اصلی یوزرنیم و پسوورد موجود بود فایل رو بزاره که دانلود بشه. اگه متوجه نشدید بگید تا فایلاشو براتون به صورت یک مثال اماده کنم و ایمیل کنم. موفق باشید.

  4. مرتضی

    ببخشید یه سوال دیگه
    چظور میتونیم برای این روش حالت ایست را بدیم و فایها را از هاست دانلود بخونیم ممنون میشم اگه جواب بدین کارم خیلی لنگه

    • شما باید دو تا فایل php بسازید , یکی روی هاست اصلی و یکی دیگه روی هاست دانلود.
      هر فایلی که قراره دانلود بشه درخواست پسوورد بده که با authentication امکان پذیره , پسوورد دریافت شده برای فایل php روی هاست اصلی فرستاده بشه و توی دیتابیس چک بشه اگه یوزرنیم و پسوورد معتبر بود به کاربر اجازه دانلود فایل داده بشه و در غیر این صورت بگه که نمیتونه فایل رو دانلود کنه. ارسال درخواست به هاست اصلی میتونه با cURL باشه.

  5. مرتضی

    سلام و خسته نباشید
    من دو تا فایل تو هاست اصلیم دارم که در فایل اولی چند دستور مای اسکیو ال نوشتم و سه ستون که تو یکیش تاریخ انقضا و یکیش عبارت md5 شده که به صورت get میفرستم به اون یکی فایل تا رکورد مورد نظر رو بتونه بخونه و یکی دیگه هم لینک دانلود هستش که وقتی فایل تو هاست اصلی هست مشکلی پیش نمیاد و دانلود میکنه ولی اگه لینکی که از هاست دانلود گرفتم رو میدم بهش خطا میده و من اگه این دو فایل رو تو هاست دانلود بزارم نمیتونم اینا رو تو دیتابس درج کنم و هاست دانلود هم دیتابیس نداره اگه زحمتی نمیشه کدی بزارین که این مشکل رو برطف کرد دعا گویتان خواهم بود

    • من دوتا فایل به صورت ازمایشی براتون درست میکنم یکی رو توی هاست اصلی قرار بدید و یکی رو توی هاست دانلود , بعدش اگه پسوورد درست باشه فایل رو دانلود میکنه. تا ۲۴ ساعت اینده یه پست راجب این سوال شما و نحوه کار با هاست دانلود میزارم. همچنین فایل ازمایشی رو براتون ایمیل میکنم. موفق باشید.

  6. سهیل

    سلام ممنون از شما خیلی عالی بود
    ممنئن میشم راهنمایی کنید واسه Resume داشتن دانلود هم راهنمایی کنید

    • واسه قابلیت resume باید با header های از نوع bye-range کار کنید بعدش با تابع fopen و fread قسمت مورد نظر رو به صورت تصادفی پیدا کنید و به سمت دانلود ارسال کنید. 😀 کار راحتیه

  7. سید محمد

    سلام چرا من از این کد استفاده میکنم بجای دانلود، محتوای فایل روی صفحه مرورگر نوشته میشه لطفا کمکم کنید.

    • ایمیل خودتون رو درست وارد کنید تا در مواقع ضروری پاسخ به ایمیل شما ارسال بشه! حتی وقتی که از طریق سایت برای بنده پیام ارسال کردید بازم ایمیل رو همینطوری الکی (fake) وارد کردید و تقاضای پاسخ سریع و کامل دارید! قسمت ایمیل همینجوری الکی قرار داده نشده!!!! موفق باشید.

  8. سلام
    متسفانه اموزش استفاده از این کدهای php رو نگفتید
    مثلا نگفتید لینک فایلمون رو کجا قرار بدیم
    لطفا اموزش استفاده رو هم قرار بدید
    باتشکر

    • راجبش به صورت کامل توضیح داده شده! اگه اموزش رو بخونید و ساختار فایلها رو بررسی کنید متوجه میشید. کافیه که اسکریپت رو دانلود کنید و تست کنید تا متوجه بشید. بازم اگه سوالی بود بگید تا مشکلتون رو برطرف کنیم.

  9. حامد

    سلام
    ممنونم بابت این آموزش مفید
    اگه بخواهیم که هم فایل را تیکه تیکه به کاربر بدهیم و هم اینکه قابلیت رزیوم داشته باشه باید چه کار کنیم؟

    • در این صورت باید با header های از نوع partial کار کنید. میتونم چنین چیزی رو براتون طراحی کنم اگه نیاز دارید. با تلگرام من در تماس باشید ۰۹۳۷۳۶۲۰۳۵۳ – موفق باشید.

می‌خواهید دیدگاهتان را بیان کنید؟