آموزش ها

دانلود فایل روی هاست

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

این کد بر روی نسخه‌های 7.x و 8.x از PHP تست شده است و قابلیت‌های زیر را داراست:

  • نمایش درصد پیشرفت دانلود (لودینگ)
  • نمایش نام و حجم فایل در حال دانلود

این کد توسط ChatGPT-4o تولید و بهینه‌سازی کردم.

نکته مهم - مخاطره امنیتی: بعد از اینکه کارتون تموم شد اسکریپت رو حتما از روی هاست پاک کنید یا از Password Protect کنترل پنل هاست برای ایجاد دسترسی استفاده کنید.

 

 

 

 

<?php
// فعال کردن خطایابی
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

 

if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['fileUrl'])) {
    $fileUrl = $_POST['fileUrl'];
    $fileName = basename($fileUrl);
    $filePath = __DIR__ . '/' . $fileName;

 

    // تابع برای نمایش پیشرفت دانلود
    function progressCallback($resource, $downloadSize, $downloaded, $uploadSize, $uploaded)
    {
        static $previousProgress = 0;
        if ($downloadSize > 0) {
            $progress = round(($downloaded / $downloadSize) * 100);
            if ($progress != $previousProgress) {
                echo "Downloaded: $progress%\n";
                ob_flush();
                flush();
                $previousProgress = $progress;
            }
        }
    }

 

    // تابع برای دانلود فایل با پشتیبانی از retry
    function downloadFile($fileUrl, $filePath, $retry = 3)
    {
        global $fileName; // معرفی متغیر جهانی برای استفاده در تابع
        while ($retry > 0) {
            $file = fopen($filePath, 'w+');
            if ($file === false) {
                echo "خطا: باز کردن فایل برای نوشتن ناموفق بود.\n";
                return false;
            }

 

            $ch = curl_init($fileUrl);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FILE, $file);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_NOPROGRESS, false);
            curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
            curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024 * 1024 * 4);
            curl_exec($ch);

 

            if (curl_errno($ch)) {
                echo 'خطا: ' . curl_error($ch) . "\n";
                curl_close($ch);
                fclose($file);
                $retry--;
                echo "تلاش دوباره در 3 ثانیه...\n";
                ob_flush();
                flush();
                sleep(3);
            } else {
                curl_close($ch);
                fclose($file);

 

                // محاسبه و نمایش نام و حجم فایل
                $fileSize = filesize($filePath);
                $formattedSize = round($fileSize / (1024 * 1024 * 1024), 2); // تبدیل به گیگابایت
                
                // نمایش اطلاعات نهایی
                echo "\n <--------- File Downloaded ---------> .\n";
          
                echo "Filename: $fileName\n";
                echo "FileSize: $formattedSize GB\n";
                
                ob_flush();
                flush();
                return true;
            }
        }

 

        echo "دانلود فایل پس از چندین تلاش ناموفق بود.\n";
        return false;
    }

 

    // شروع دانلود فایل
    downloadFile($fileUrl, $filePath);
}
?>

 

<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>دانلود فایل</title>
    <style>
        body { font-family: Arial, sans-serif; }
        form { margin-bottom: 20px; }
        pre { background: #f4f4f4; padding: 10px; border: 1px solid #ddd; white-space: pre-wrap; }
    </style>
</head>
<body>
    <h1>دانلود فایل</h1>
    <form action="" method="post">
        <label for="fileUrl">آدرس فایل:</label>
        <input type="text" id="fileUrl" name="fileUrl" required>
        <button type="submit">دانلود</button>
    </form>
    <pre id="output">
        <!-- خروجی به‌روز شده اینجا نمایش داده می‌شود -->
    </pre>
</body>
</html>


Related Articles

درباره من

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