آموزش ویدیویی انتقال سریع فایل از هاست به هاست دیگر

انتقال سریع فایل از هاست به هاست دیگر – یکی از دغدغه های اصلی مدیران وب سایت انتقال فایل ( اطلاعات ) از هاست قبلی به هاست جدید می باشد .
به جز قالب و افزونه هایی روی هاست قبلی نصب است و نیاز به انتقال و نصب روی هاست جدید دارد 2 بخش اصلی از اطلاعات سایت شامل :
1- اطلاعات دیتابیس
2- فایل های دانلود روی هاست دانلود ( در این آموزش روی این مبحث متمرکز خواهیم شد )
نیازمند انتقال است .
index.php برای فرم دریافت لینک فایل ها
فرمی را خواهیم داشت که می تواند لینک های فایل ها را دریافت کرده و پس از ارسال درخواست به فایل file-transfer.php نتیجه در جدول پایین خود نمایش دهد .
همچنین در این آموزش از کتابخانه farvardin.js برای تبدیل تاریخ میلادی به شمسی استفاده می کنیم .
<!DOCTYPE html> <html lang="fa"> <head> <meta charset="UTF-8"> <title>Rapidcode.iR - انتقال فایل بین 2 هاست مختلف</title> <link rel="stylesheet" href="static/css/main.css"> </head> <body> <div class="container"> <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a> <form dir="ltr" id="form-host-info"> <textarea name="remote-file" id="remote-file" rows="10" placeholder="لینک فایلی که میخواهید انتقال دهید"></textarea> <input type="button" id="send" value="انتقال"> </form> <table id="logger"> <thead> <tr> <th>تاریخ و زمان</th> <th>پیغام</th> </tr> </thead> <tbody> </tbody> </table> </div> <script src="static/js/lib/farvardin.min.js"></script> <script src="static/js/app.js"></script> </body> </html>
فایل main.css کمی استایل برای زیبایی برنامه
.container { margin: 0 auto; width: 80%; text-align: center; direction: rtl; } #introduce { display: block; width: 100%; font-size: 35px; font-weight: bold; color: white; padding-bottom: 5px; background-color: #4CAF50; text-decoration: none; margin-bottom: 15px; } /* Page Style */ #logger { border-collapse: collapse; width: 100%; margin-top: 35px; } #logger th, #logger td { border: 1px solid green; padding: 5px 10px; } #logger td { direction: ltr; } #logger th:first-child { width: 35%; } #success { background-color: green; color: white; border-radius: 5px; display: inline-block; padding: 5px; }
فایل file-transfer.php برای دانلود از هاست قدیمی و انتقال فایل به هاست جدید
max_execution_time حداکثر زمان برای اجرا اسکریپت php که پیشفرض روی 30 ثانیه است ولی با قرار دادن عدد 0 آن را روی نامحدود تنظیم می کنیم یعنی تا زمانی که دانلود و انتقال فایل زمان می برد اسکریپت اجرا شود .
<?php ini_set("max_execution_time", 0); # در صورتی که از محیط شل استفاده می کنید نیازی به این نیست class TransferFileHosts { private $transfer_rate = 8192; // max chunk size 8192 public $remote_link = ""; public $path_to_save = ""; public $file_basename = ""; public $file_extension = ""; public $filename = ""; public $file_size = 0; public function __construct($remote_link = null, $path_to_save = null) { if (!$remote_link) return false; if (!is_dir($path_to_save)) mkdir($path_to_save); $this->remote_link = $remote_link; $this->path_to_save = $path_to_save; $fileinfo = pathinfo($this->remote_link); $this->file_basename = $fileinfo["basename"]; $this->file_extension = $fileinfo["extension"]; $this->filename = $fileinfo["filename"]; $this->file_size = $this->get_remote_filesize($this->remote_link, false); } public function get_remote_filesize($remote_link = null, $convert_to_mb = true) { $tmp_remote_link = $remote_link; if (!$tmp_remote_link) $tmp_remote_link = $this->remote_link; $headers_data = get_headers($tmp_remote_link, true); $filesize = $headers_data['Content-Length']; $filesize = $convert_to_mb ? $this->convert_byte_to_mb($filesize) : $filesize; return $filesize; } public function convert_byte_to_mb(int $byte) { $mb = $byte / 1048576; $mb = round($mb, 2); return $mb; } public function download_file() { $progress_percent = 0; $filesize = $this->convert_byte_to_mb($this->file_size); $path_to_save = "{$this->path_to_save}{$this->file_basename}"; echo "<p id=\"download\">Downloading {$this->file_basename} with size : {$filesize} MB<p>"; $fp_server = fopen($this->remote_link, "rb"); $fp_local = fopen($path_to_save, "wb"); while (!feof($fp_server) && $content = fread($fp_server, $this->transfer_rate)) { $progress_percent += strlen($content) / $this->file_size * 100; fwrite($fp_local, $content); } echo "<p id=\"transfer\">file <strong id=\"filename\">{$this->file_basename} </strong><span id=\"success\"> successfully</span> transferred to {$path_to_save}<p>"; } } $save_path = __DIR__ . "/server/"; $link = @$_POST['remote-file']; if (!$link) { die("<p id=\"error\">no remote file passed !</p>"); } $transfer_agent = new TransferFileHosts($link, $save_path); $transfer_agent->download_file();
توضیحات لازم برای کلاس TransferFileHosts
در ابتدا که ویژگی مورد نظر مان را با توجه به کاربرد و سطح دسترسی شان تعریف می کنیم :
- transfer_rate ← نرخ انتقال اطلاعات از آنجایی که تابع fread حداکثر تا 8192 بایت امکان دریافت داده دارد .
- remote_link ← لینک فایلی که می خواهیم دانلود و به هاست جدید انتقال داده شود .
- path_to_save ← مسیری که می خواهیم فایل دانلود شده روی آن ذخیره شود .
- file_basename ← نام فایل + پسوند ( این متغیر پس از وارد کردن لینک فایل مقدار دهی خواهد شد )
- file_extension ← پسوند فایل ( *.x )
- filename ← نام فایل ( x.* )
- file_size ← حجم فایل ( برحسب بایت )
متد __construct
پس از وارد کردن آدرس لینک فایل و مسیر ذخیره این متد شروع می کند به مقدار دهی .
با کمک تابع pathinfo می توانیم کلی جزئیات از نام فایل داشته باشیم .
متد get_remote_filesize
این متد پس از وارد کردن لینک فایل حجم آن را با تابع get_headers با ما می دهد همچنین اگر دومین پارامتر آن true باشد حجم آن را به مگابایت تبدیل می کند .
متد convert_byte_to_mb
از نام آن مشخص هست تبدیل واحد بایت به مگابایت .
متد download_file
progress_percent درصد دریافت اطلاعات را به ما می دهد در صورتی که این پروژه را بر روی shell اجرا می کنید به کارتان خواهد آمد .
- fp_server : فایل پوینتری هست برای دریافت اطلاعات از لینک داده شده . مود rb خواندن داده به صورت باینری
- fp_local : فایل پوینتری برای ذخیره فایل دانلود شده از هاست بر روی مسیر داده شده . مود wb ذخیره داده به صورت باینری
- تابع fread : آرگومان دوم این است که در هر درخواست چه میزان از داده را بخواند ( برحسب بایت ) که روی حداکثر 8192 تنظیم کردیم .
- تابع feof : بررسی می کند به پایان داده فایل رسیده است یا خیر .
در پایان لینک فایل را که به صورت متد POST ارسال می گردد را دریافت و با مسیر ذخیره به کلاس TransferFileHosts می دهیم و با متد download_file انتقال و ذخیره می کنیم .
فایل app.js ارسال درخواست POST
js بازها می دونند که دیگه کار های Dom manipulation و xhr رو با این فایل انجام می دیم ( کار های ساده )
let url = location.href + "file-transfer.php"; var itemCounter = 0; let remoteFiles = []; const btnSend = document.getElementById("send"); const inpRemoteFileUrl = document.getElementById("remote-file"); // Register Event Listener btnSend.addEventListener("click" , handlerSendTransferRequest); // functions function funcGetPersianDate(){ const date = new Date(); const fullDate = [date.getFullYear() , date.getMonth() , date.getDate()]; const persianDate = farvardin.gregorianToSolar(fullDate[0] , fullDate[1] , fullDate[2] , "string") + " # " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); return persianDate; } function funcInsertToTable(tableDom , domData){ tableDom.querySelector("tbody").innerHTML += domData; } function funcShowMessageResponse(response){ itemCounter++; const table = document.getElementById("logger"); const html = new DOMParser().parseFromString(response , "text/html"); let downloadDom = html.getElementById("download"); let transferDom = html.getElementById("transfer"); const persianDate = funcGetPersianDate(); const tableRowDom = `<tr><td>${persianDate}</td><td id="dl-${itemCounter}"></td></tr><tr><td>${persianDate}</td><td id="tr-${itemCounter}"></td></tr>`; funcInsertToTable(table , tableRowDom); document.getElementById("dl-"+itemCounter).appendChild(downloadDom); document.getElementById("tr-"+itemCounter).appendChild(transferDom); } function funcSendPostRequest(url){ if(!remoteFiles[0]) return false; btnSend.setAttribute("disabled" , "true"); const xhr = new XMLHttpRequest(); xhr.open("POST" , url); const form = new FormData(); form.append("remote-file" , remoteFiles[0]); xhr.onload = function(){ if(this.status === 200){ const response = this.response; funcShowMessageResponse(response); remoteFiles.shift(); if(remoteFiles[0]) funcSendPostRequest(url); else btnSend.removeAttribute("disabled"); }else{ alert("خطایی از سمت سرور میزبان دریافت گردید") } } xhr.onerror = function(e){ alert("خطای شبکه"); console.warn(e); } xhr.send(form); } // handler functions function handlerSendTransferRequest(wedontneedthiseventLoL){ const remoteFile = inpRemoteFileUrl.value.split("\n"); if(!remoteFile) { alert("یک آدرس معتبر برای انتقال فایل وارد کنید !"); return false; } remoteFiles = remoteFile; funcSendPostRequest(url); }
انتقال سریع فایل از هاست به هاست دیگر
ارسال نظر