رایگان کد PHP اسکریپت آپلود فایل در هاست دانلود از طریق FTP در سایت اصلی - تک فایل

به انجمن تخصصی وبمستران خوش آمدید!

با عضویت در انجمن، به محتوای اختصاصی ویژه وبمستران دسترسی داشته باشید و از امکانات بی نظیر اعضای انجمن بهره مند شوید.

همین الان عضو شوید!

رایگان کد PHP اسکریپت آپلود فایل در هاست دانلود از طریق FTP در سایت اصلی - تک فایل

  • موضوع نویسنده
اگر هاست دانلود دارید و قصد دارید فایل های خود را از طریق یه آپلودر ساده و بدون دیتابیس داخل این هاست دانلود آپلود کنید، می توانید از یک فایل PHP خیلی ساده استفاده کنید و با FTP فایل خود را به هاست دانلود ارسال کنید که البته با رمز عبور محافظت می شود. این فایل را شما باید در سایت اصلی خود قرار دهید چرا که اکثر هاست های دانلود امکان اضافه کردن فایل PHP را ندارند. در ادامه با هم مرحله به مرحله ساخت این آپلودر را توضیح می دهیم. برای شروع شما نیاز به یک هاست دانلود دارید و سایت اصلی شما با هر نوع سیستم مدیریت محتوایی که هست هم باید یک هاست مخصوص به خود را داشته باشد. این فایل بطور اختصاصی توسط احمدرضا کریمی نوشته شده و کپی و نشر آن در سایر سایت ها با ذکر منبع مجاز است! ☺️ همچنین توجه کنید که شما امکان گسترش این کد و اضافه کردن امکانات جدید به آن را دارید ولی در صورت انجام این کار، می بایست در انتهای سایت خود نام انجمن یا سایت لینک: صفحه اصلی را ذکر کنید.

file-upload-site-3.jpg


ویژگی ها و امکانات این آپلود کننده فایل


  1. بدون نیاز به نصب و دیتابیس
  2. امکان محافظت از فرم آپلود با پسورد دلخواه
  3. آپلود فایل در هاست دانلود یا هاست دلخواه از طریق FTP
  4. آپلود آجاکس و مشاهده نوار پیشرفت و درصد تکمیل آپلود
  5. مشاهده حجم کلی فایل و حجم آپلود شده به صورت لحظه ای
  6. امکان تعیین فرمت های مجاز آپلود
  7. دارای سیستم مسدود کردن خودکار 24 ساعته کاربر با تلاش زیاد برای ورود به آپلود کننده (بلاک کردن آی پی خودکار)
  8. امکان تعیین زمان دلخواه مسدود بودن آی پی تلاش کننده ورود با پسورد اشتباه
  9. امکان تعیین تعداد دفعات تلاش برای ورود به فرم و حداکثر تعداد مجاز پسورد اشتباه
  10. امکان تعیین حداکثر حجم فایل قابل آپلود با حجم مگابایت
  11. کاملا سبک، فارسی و دارای فونت وزیرمتن

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


  1. هاست دانلود شما می تواند از دو نوع دایرکت ادمین یا cPanel باشد
  2. هاست اصلی شما باید توابع FTP و خواندن و نوشتن موقت فایل و ارسال فایل را داشته باشد
  3. هاست دانلود شما باید دارای یک آدرس دامین مخصوص به خود باشد. چه ساب دامین چه دامین کامل!
  4. در هاست اصلی نیاز به ساخت دیتابیس برای آپلودر ندارید.
  5. در هاست دانلود نیاز به ساخت دیتابیس ندارید.

شروع ساخت آپلود کننده ساده اما ایمن


ابتدا کل فایل زیر را کپی کرده و در یک پوشه یا روت سایت اصلی خود با نام دلخواه بعنوان مثال up.php قرار دهید. فایل زیر کد کامل آپلود کننده فایل ما هستش. دقت کنید که این فایل را باید در هاست سایت اصلی خودتان قرار دهید.
توجه کنید که پسورد پیش فرض ورود به پنل v83M629KQkqNTwCx است.
PHP:
<?php
// --- تنظیمات ----
$password = 'v83M629KQkqNTwCx';
$max_attempts = 3;
$block_time = 60 * 60 * 24;
$temp_upload_dir = __DIR__ . '/temp_uploads';
$max_file_size = 500 * 1024 * 1024; // 500MB

$allowed_extensions = [
    "jpg","jpeg","png","gif","bmp","svg","webp",
    "zip","rar","7z","tar","gz","pdf","doc","docx","xls","xlsx","ppt","pptx",
    "mp3","mp4","mkv","avi","mov","wav","ogg","flac",
    "apk","exe","msi","ttf","otf","woff","woff2"
];

$ftp_host = 'dl.akarimi.com';
$ftp_user = 'یوزرنیم';
$ftp_pass = 'پسورد';
$ftp_port = 21;
$ftp_root_path = '/domains/dl.akarimi.com/public_html/data/fileha';
$download_domain = 'https://dl.akarimi.com/data/fileha';

function get_client_ip() {
    return $_SERVER['REMOTE_ADDR'];
}
function block_file() {
    return __DIR__.'/_upload_blocklist.json';
}
function check_block() {
    $ip = get_client_ip();
    $file = block_file();
    if (!file_exists($file)) return false;
    $blocks = json_decode(file_get_contents($file), true) ?: [];
    if (isset($blocks[$ip]) && $blocks[$ip]['expire'] > time()) return $blocks[$ip];
    return false;
}
function add_block($duration) {
    $ip = get_client_ip();
    $file = block_file();
    $blocks = file_exists($file) ? json_decode(file_get_contents($file), true) : [];
    $blocks[$ip] = ['expire'=>time()+$duration, 'attempts'=>0];
    file_put_contents($file, json_encode($blocks));
}
function increase_attempt() {
    $ip = get_client_ip();
    $file = block_file();
    $blocks = file_exists($file) ? json_decode(file_get_contents($file), true) : [];
    if (!isset($blocks[$ip])) $blocks[$ip] = ['expire'=>0,'attempts'=>0];
    $blocks[$ip]['attempts'] = intval($blocks[$ip]['attempts'])+1;
    file_put_contents($file, json_encode($blocks));
    return $blocks[$ip]['attempts'];
}
function reset_attempt() {
    $ip = get_client_ip();
    $file = block_file();
    if (file_exists($file)) {
        $blocks = json_decode(file_get_contents($file), true) ?: [];
        if (isset($blocks[$ip])) {
            unset($blocks[$ip]);
            file_put_contents($file, json_encode($blocks));
        }
    }
}

session_start();
$message = '';
$blocked = check_block();
if ($blocked && $blocked['expire'] > time()) {
    $remain = intval(($blocked['expire']-time())/60);
    die('<div class="error">به دلیل تلاش‌های زیاد، تا '. $remain .' دقیقه دیگر فرم آپلود برای شما غیرفعال است.</div>');
}
$authed = isset($_SESSION['auth_ok']) && $_SESSION['auth_ok']===true;
if (!$authed && isset($_POST['password'])) {
    if ($_POST['password'] === $password) {
        $_SESSION['auth_ok'] = true;
        reset_attempt();
        header("Location: ".$_SERVER['PHP_SELF']); exit;
    } else {
        $tries = increase_attempt();
        if ($tries >= $max_attempts) {
            add_block($block_time);
            die('<div class="error">رمز عبور را سه بار اشتباه وارد کردید! تا ۲۴ ساعت آینده بلاک هستید.</div>');
        } else {
            $message = "رمز عبور اشتباه است. تلاش باقی‌مانده: ".($max_attempts-$tries);
        }
    }
}
if (!$authed) {
    echo <<<HTML
<!DOCTYPE html>
<html lang="fa" dir="rtl"><head>
<meta charset="UTF-8">
<title>ورود - فرم آپلود امن</title>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
<style>body { background: #fafdff; font-family: Vazirmatn, Tahoma, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; }
.login-box { background: #fff7e6; padding: 2.5rem 2rem 1.5rem 2rem; border-radius: 18px; width: 350px; box-shadow: 0 4px 32px #ffde7a85; }
h2 { text-align: center; margin-bottom: 25px; color: #e29a04;}
input[type=password] { font-size: 1.15em; border-radius: 8px; border: 1px solid #ead4a0; padding: 10px; width: 100%; box-sizing: border-box; margin-bottom: 15px;}
button { background: linear-gradient(90deg,#feaf7f,#e29a04); color: #fff; padding: 10px 32px; border: none; border-radius: 8px; cursor: pointer; width: 100%; font-size: 1.2em;}
.error { background: #ffefec; color: #e02904; padding: 8px; text-align: center; margin-bottom: 18px; border-radius: 7px; font-weight: 600;}
html,p,input,button,textarea,a,h1,h2,h3,h4,h5,h6 {font-family: Vazirmatn, Tahoma, sans-serif;}
</style>
</head><body>
    <form class="login-box" method="post">
        <h2>ورود</h2>
        <input type="password" name="password" autocomplete="off" placeholder="رمز عبور را وارد کنید" required autofocus>
        <button type="submit">ورود</button>
        <br>
        <div class="error">{$message}</div>
    </form>
</body>
</html>
HTML;
    exit;
}
if (!is_dir($temp_upload_dir)) @mkdir($temp_upload_dir, 0755, true);

// ==== اگر درخواست AJAX آپلود است ====
if(isset($_GET['ajax_upload']) && $_GET['ajax_upload']=="1") {
    // پاسخ را JSON برمی‌گردانیم
    $response = ['success'=>false, 'error'=>'', 'link'=>''];

    $year = date("Y");
    $month = date("m");
    $ftp_dest_folder = "{$ftp_root_path}/{$year}/{$month}";
    $web_url_folder = "{$download_domain}/{$year}/{$month}";

    if (!isset($_FILES['file'])) $response['error'] = 'هیچ فایلی ارسال نشده است.';
    elseif ($_FILES['file']['size'] > $max_file_size) $response['error'] = "حجم فایل بیشتر از حد مجاز (۵۰۰ مگابایت) است.";
    elseif ($_FILES['file']['error'] > 0) $response['error'] = "خطا در انتقال فایل: ". $_FILES['file']['error'];
    else {
        $fileinfo = pathinfo($_FILES['file']['name']);
        $ext = strtolower($fileinfo["extension"]??'');
        if (!in_array($ext, $allowed_extensions)) $response['error'] = "فرمت فایل مجاز نیست.";
        elseif (in_array($ext,['php','html','htm','js','sh','bat','phtml','php3','phar','ini','cmd','pl','asp','jsp','cgi','py','rb','ps1','xml','yaml','yml','css','txt','md','htaccess','shtml','xhtml','com']))
            $response['error'] = "این فرمت امنیتی بوده و قابل آپلود نیست.";
        else {
            $unique_prefix = time();
            $safe_name = preg_replace('/[^\w\-.]/u', '_', $fileinfo["filename"]);
            $final_name = $unique_prefix . '_' . $safe_name . '.' . $ext;
            $temp_file = "{$temp_upload_dir}/{$final_name}";
            if (move_uploaded_file($_FILES['file']['tmp_name'],$temp_file)) {
                // FTP send
                $ftp_conn = ftp_connect($ftp_host, $ftp_port, 20);
                if (!$ftp_conn) $response['error']="امکان اتصال به FTP هاست دانلود وجود ندارد.";
                elseif (!ftp_login($ftp_conn, $ftp_user, $ftp_pass)) {$response['error']="خطا در ورود به FTP.";ftp_close($ftp_conn);}
                else {
                    ftp_pasv($ftp_conn, true);
                    $folders = ['',$year, $month];
                    $curr_path = $ftp_root_path;
                    // اگر پوشه fileha و بعدش سال و ماه نبود، درستش کن
                    foreach($folders as $f){ if($f) {
                        $check_path = $curr_path.'/'.$f;
                        if (!@ftp_chdir($ftp_conn,$check_path)) @ftp_mkdir($ftp_conn,$check_path);
                        $curr_path = $check_path;
                    } }
                    $ftp_dest_file = $curr_path.'/'.$final_name;
                    $upload = @ftp_put($ftp_conn, $ftp_dest_file, $temp_file, FTP_BINARY);
                    ftp_close($ftp_conn);
                    if ($upload) {
                        $response['success'] = true;
                        $response['link'] = $web_url_folder.'/'.$final_name;
                        @unlink($temp_file);
                    } else { $response['error'] = "مشکل در کپی فایل بر روی هاست دانلود. فضای کافی یا دسترسی مسیر را چک کنید."; @unlink($temp_file);}
                }
            } else $response['error'] = "ذخیره موقت فایل روی سرور انجام نشد!";
        }
    }
    header('Content-Type: application/json');
    echo json_encode($response); exit;
}
?><!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
  <meta charset="UTF-8">
  <title>آپلود فایل به هاست دانلود - ویژه fileha</title>
  <link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
  <style>
    body {background:linear-gradient(115deg,#faf8fe 10%,#ffe6be 90%);font-family:Vazirmatn,Tahoma,sans-serif;min-height:100vh;display:flex;flex-direction:column;align-items:center;}
    .upload-box {background:#fff8f0cc;border-radius:18px;box-shadow:0 8px 32px #e29a0475;max-width:480px;margin-top:7vw;width:95vw;padding:30px 22px 18px 22px;}
    h1 {color:#c88513;font-size:2em;margin-bottom:18px;text-align:center;}
    label {font-weight:600;color:#875c1b;}
    input[type=file] {margin:13px 0 21px 0;font-size:1.1em;}
    button, .copy-btn {background:linear-gradient(90deg,#feaf7f,#e29a04);color:#fff;border:none;border-radius:8px;padding:10px 33px;font-size:1.13em;font-family:Vazirmatn;cursor:pointer;margin-top:0;margin-bottom:12px;transition:.22s;box-shadow:0 4px 12px #e29a044a;}
    button:hover, .copy-btn:hover {background:linear-gradient(90deg,#ffb469,#f7a200);}
    .success{background:#ecf9e0;color:#247406;padding:13px;border-radius:9px;font-size:1em;margin-bottom:15px;}
    .error{background:#ffeeee;color:#bb1010;padding:10px;border-radius:8px;font-size:.98em;margin-bottom:18px;}
    .link-box{margin-top:13px;display:flex;align-items:center;gap:8px;}
    .urlfield{font-size:1.01em;border-radius:7px;border:1px solid #eae99d;padding:7px 7px;background:#fffbe8;}
    .prog-bg{background:#e2e8fa;border-radius:6px;height:27px;width:100%;box-shadow:none;overflow:hidden;margin-top:6px;margin-bottom:7px;display:none;}
    .prog-bar{background:linear-gradient(90deg,#e29a04,#feaf7f);height:100%;width:0%;box-shadow:0 0 8px #e29a0450 inset;border-radius:6px;}
    .prog-info{text-align:center;font-size:1em;margin-bottom:0px;color:#875c1b;font-weight:500;}
    @media(max-width:480px){.upload-box{padding:12px 5px}}
  </style>
</head>
<body>
<div class="upload-box">
  <h1>🟧 آپلود فایل به fileha</h1>
  <form id="uploadform" style="direction:rtl">
    <label for="fup">فایل را انتخاب کنید (حداکثر ۵۰۰MB):</label>
    <input type="file" name="upload_file" id="fup" required>
    <div class="prog-bg" id="prog-bg">
      <div class="prog-bar" id="prog-bar"></div>
    </div>
    <div class="prog-info" id="prog-info"></div>
    <button type="submit" id="submitbtn">آپلود و انتقال</button>
  </form>
  <div id="show-result"></div>
</div>
<script>
let upform=document.getElementById("uploadform");
let progBg=document.getElementById("prog-bg"), progBar=document.getElementById("prog-bar"), progInfo=document.getElementById("prog-info");
let showResult=document.getElementById("show-result"), btn=document.getElementById("submitbtn");

upform.onsubmit=function(e){
  e.preventDefault();
  showResult.innerHTML = "";
  let file = document.getElementById("fup").files[0];
  if(!file){showResult.innerHTML='<div class="error">لطفا یک فایل انتخاب نمایید.</div>';return;}
  progBg.style.display="block"; progBar.style.width="0%"; progInfo.innerHTML="در حال آپلود فایل..."; btn.disabled=true;
  let data=new FormData(); data.append("file",file);
  let xhr=new XMLHttpRequest();
  xhr.open("POST","?ajax_upload=1",true);
  xhr.upload.onprogress=function(e){
    if(e.lengthComputable){
      let p=Math.round((e.loaded*100)/e.total);
      progBar.style.width = p + "%";
      progInfo.innerHTML = "پیشرفت: "+ p +"% ("+Math.round(e.loaded/1048576)+" مگابایت از "+Math.round(e.total/1048576) +" مگابایت)";
    }
  };
  xhr.onreadystatechange=function(){
    if(xhr.readyState==4){
      btn.disabled=false;
      progBg.style.display="none";
      progInfo.innerHTML = "";
      try{
        let resp=JSON.parse(xhr.responseText);
        if(resp.success){
          showResult.innerHTML='<div class="success">✅ آپلود و انتقال به هاست دانلود با موفقیت انجام شد.</div>'+
            '<div class="link-box"><input type="text" value="'+resp.link+'" readonly class="urlfield" id="uplink">'+
            '<button class="copy-btn" type="button" onclick="copyLink()">کپی</button></div>';
        }else{
          showResult.innerHTML='<div class="error">'+resp.error+'</div>';
        }
      }catch(ex){
        showResult.innerHTML='<div class="error">خطای غیرمنتظره از سرور؛ لطفا مجدداً تلاش کنید.</div>';
      }
    }
  };
  xhr.send(data);
};

function copyLink(){
  var f=document.getElementById("uplink");
  f.select(); f.setSelectionRange(0,99999);
  document.execCommand("copy");
  let btn2=document.querySelector('.copy-btn');
  btn2.innerText='کپی شد!';
  setTimeout(()=>{btn2.innerText='کپی'},900);
}
</script>
</body>
</html>

تنظیمات اسکریپت


در داخل فایل، قسمت های مختلفی را می توانید تنظیم کنید که مهم ترین آنها را در زیر همراه با کمی توضیحات به شما آموزش می دهیم. می توانید این کد را گسترش دهید و قابلیت های جدیدی به آن اضافه کنید.

تغییر پسورد ورود


جهت تغییر پسورد ورود به پنل اصلی آپلود فایل، در خط 3 این کد می توانید پسورد دلخواهتان را بجای v83M629KQkqNTwCx قرار دهید.

تعداد دفعات تلاش برای ورود


در خط 4 عدد 3 بیانگر محدودیت 3 بار برای تلاش به ورود به پنل است و بعد از آن آی پی کاربر مسدود خواهد شد. اگر میخواهید محدودیت را تغییر دهید فقط عدد را تغییر دهید.

مدت زمان مسدود بودن کاربر بلاک شده


در خط 5 در کد $block_time = 60 * 60 * 24; می توانید بجای عدد 24 مدت زمان به ساعت وارد کنید که کاربری که حداکثر تلاش برای ورود به پنل کرده، در صورت بلاک، چند ساعت مسدود بماند. کاربر بعد از سپری شدن این مدت زمان می تواند دوباره برای ورود به پنل تلاش کند.

حداکثر حجم فایل آپلودی


این مقدار را باید بر اساس محدودیت حجم آپلود در هاست خود و هاست دانلود تعیین کنید. در واقع این محدودیت صرفا روی فرم آپلود فایل اثر دارد و اگر حجم فایل از محدودیت آپلود فایل هاست اصلی و هاست دانلود بیشتر باشد، عملیات آپلود خطا خواهد داد. بنابراین حتما حداکثر حجم مجاز آپلود فایل در هاست خود را افزایش دهید.
در خط 7 در کد $max_file_size = 500 * 1024 * 1024; عدد 500 در واقع مگابایت خواهد بود. یعنی الان حداکثر حجم ما 500 مگابایت است. اگر مثلا عدد 300 وارد کنید، حداکثر حجم فایل آپلودی شما 300 مگابایت خواهد بود.

فرمت های مجاز آپلود


در خط 9 در متغیر $allowed_extensions لیست فرمت های مجاز برای آپلود تعیین شده است و فرمت های اینجا، تنها فرمت هایی هستند که می توانید آپلود کنید. می توانید فرمت ها را به دلخواه کم و زیاد کنید.

تنظیم و اتصال به FTP


در هاست دانلود یا هاست هدف که میخواهید فایل ها را داخل آن آپلود کنید یک اکانت FTP بسازید و مشخصات آن را طبق خط های زیر تنظیم کنید:
  1. آدرس هاست: در خط 16 بجای dl.akarimi.com آدرس اصلی هاست دانلود را وارد کنید.
  2. یوزرنیم: در خط 17 نام کاربری FTP را وارد کنید.
  3. پسورد: در خط 18 رمزعبور FTP را وارد کنید.
  4. پورت: در خط 19 بجای عدد 21 پورت FTP هاست خود را وارد کنید. معمولا عدد 21 است ولی اگه داخل هاستینگ شما پورت دیگه ای تنظیم شده جایگزین کنید.
  5. روت ذخیره سازی فایل FTP: شما باید مسیری که برای آپلود فایل FTP مشخص کرده اید را در خط 20 وارد کنید. یعنی /domains/dl.akarimi.com/public_html/data/fileha را با محل دقیق FTP خودتان جایگزین کنید.
  6. آدرس دانلود مستقیم فایل: در خط 21 بجای https://dl.akarimi.com/data/fileha باید آدرس دسترسی به فایل را همراه با دامین خود وارد کنید. بعد از آپلود فایل، این لینک به همراه نام فایل ترکیب شده و لینک مستقیم تولید می شود.

استفاده از آپلود کننده فایل


بعد از انجام تنظیمات، الان وقت استفاده از آپلود کننده فایل است. ابتدا فایل PHP آپلود کننده خود که در سایت اصلی خود قرار داده اید و کد را داخل آن قرار داده اید، را با لینک مستقیم باز کنید.
Screenshot_1.png

در مرحله اول از شما رمزعبور می خواهد که باید دقیقا همان رمزعبور تنظیم شده داخل فایل PHP را وارد کنید.
Screenshot_2.png

در صورت صحیح بودن رمزعبور وارد پنل خواهید شد و می توانید آپلود فایل را آغاز کنید.
ما یک فایل آزمایشی انتخاب می کنیم:
Screenshot_3.png

یک نوار پیشرفت اضافه خواهد شد و اگر اطلاعات FTP صحیح باشد، شروع به آپلود خواهد کرد. در صورت صحیح نبودن FTP خطا می گیرید که باید خطا را اصلاح کنید.
بعد از آپلود موفقیت آمیز فایل، چنین متنی مشاهده می کنید که می توانید با کلید "کپی" لینک مستقیم فایل را کپی کنید.
Screenshot_4.png

جهت تست کردن درست بودن لینک مستقیم، لینک کپی شده را داخل مرورگر اجرا کنید. اگر فایل دانلود شد، تنظیمات خط 21 فایل PHP شما درست است. در غیر اینصورت باید بررسی کنید که آدرس های خط 20 و 21 صحیح است و فایل در هاست دانلود اضافه شده است یا نه.

راهنمایی و سوال


سعی کردم یک آموزش کامل آماده کنم. اگه سوال یا مشکل یا شخصی سازی نیاز داشتید در ادامه همین تاپیک بپرسید.
 
بازگشت
بالا پایین