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

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

انتقال سریع فایل از هاست به هاست دیگر – یکی از دغدغه های اصلی مدیران وب سایت انتقال فایل ( اطلاعات ) از هاست قبلی به هاست جدید می باشد .


به جز قالب و افزونه هایی روی هاست قبلی نصب است و نیاز به انتقال و نصب روی هاست جدید دارد 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);
}

انتقال سریع فایل از هاست به هاست دیگر

دانلود سورس انتقال هاست به هاست

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

contact us