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

انتقال سریع فایل از هاست به هاست دیگر – یکی از دغدغه های اصلی مدیران وب سایت انتقال فایل ( اطلاعات ) از هاست قبلی به هاست جدید می باشد .
به جز قالب و افزونه هایی روی هاست قبلی نصب است و نیاز به انتقال و نصب روی هاست جدید دارد 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);
}
انتقال سریع فایل از هاست به هاست دیگر
ارسال نظر