سلام. با توجه به سرعت پایین آپلود اینترنت، آپلود فایلهای حجیم بر روی هاست میتواند بسیار وقتگیر و خستهکننده باشد. اگر فایلی دارید که قبلاً روی اینترنت آپلود شده و میخواهید آن را به هاست خود منتقل کنید، نیازی نیست ابتدا آن را دانلود و سپس آپلود کنید. با استفاده از این اسکریپت 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>