Скрипт за копиране на файлове от уеб на PC-то
МАЛКО ОБЩИ ДУМИ:

Накратко, това е РНР-скрипт, чрез който бихте могли да копирате файлове (графика или ХТМЛ, аз копирах снимки), от уеб-сървър на личния си компютър.
Скриптът НЕ използва БД, но лесно може да се пригоди и към тях, ако адресите на файловете Ви са налични в БД (за допълнително улеснение съм използвал 1 към 1 част от скрипта за странициране на Админ).
Онова, което ви е нужно, за да подкарате скрипта са УРЛ-адресите на файловете, които ще копирате и инсталиран РНР-сървър на РС-то. (аз използвам EasyPHP1-8 под Уиндоус)
Важно условие е файловете да са достъпни и адресите да са точни.


СКРИПТЪТ:


<?
$fm=file("abc.txt");
$kolko=count($fm);


$broinastranica = 10;
$pageNum = 1;

if(isset($_GET['page']))
{
$pageNum =$_GET['page'];
$start = ($pageNum - 1) * $broinastranica;

$raport=$_GET['raport'];
$alert=$_GET['alert'];
}
else
{
$start=0;
$raport=0;
$alert=0;
}



for($i = $start; $i < ($start+$broinastranica); $i++)
{
$iztochnik=trim($fm[$i]);

$kopie=str_replace ("URL-адреса", "", $iztochnik);

$cel="директорията на личния ви комп/".$kopie;

if(@copy($iztochnik, $cel))
{
$raport++;
}
else
{
$alert++;

$niz=$iztochnik."\n";
$bd_file="alert.txt";

$bd=fopen($bd_file,"a+");
$rprt=fwrite($bd, "$niz");
fclose($bd);
}
if ($i==$kolko) break;
}



$maxPage = ceil($kolko/$broinastranica);
$self = $_SERVER['PHP_SELF'];


if ($pageNum < $maxPage)
{
$page = $pageNum + 1;
header( "refresh: ".(5)."; url= ". "$self?page=$page&raport=$raport&alert=$alert" );
$list="<CENTER><BR><BR><BR><BR><B>Процесът продължава!</B> Прочетени страници: $pageNum. Временен резултат:";
}
else
{
$list="<CENTER><BR><BR><BR><BR><B>Процесът завърши!</B> Финален резултат:";
}
?>

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY>
<?
echo "$list<BR><BR>Източник: $kolko<BR>Копирани файлове: $raport<BR>Грешки: $alert";
?>
</BODY>
</HTML>



ОБЯСНЕНИЯТА:

Адресите на файловете, к ще се копират се записват в обикновен текстови файл, в случая съм го озаглавил "abc.txt" като всеки адрес е на нов ред.
Чрез file(); четем съдържанието на abc.txt. Функцията връща масив - fm[], чийто елементи са редовете от файла.
В моя случай имах като записи не само имената на файловете, но и пълния им адрес затова при обхождането във фор-цикъла ми се налага да го премахна, за да дам чисто име на създаваното копие. За целта използвам str_replace ();

Синтаксисът и е следния:

str_replace ("низ който да се замени", "низ който да бъде поставен на неговото място", $целият_низ);

В конкретния случай заменяме УРЛ-адреса с (""), т.е. премахваме го.
Вече освен пълния път с името на файла имаме и чистото му име, което ще сложим на копието.

Синтаксиса на функцията за копиране на файлове:

copy($iztochnik, $cel);

където $източник е пълния път и името на файла, който се копира, а $цел - местоположението и името на копието.

Пред функцията copy(); има знак @, която ще подтисне съобщението за грешка, ако по някаква причина текущият файл не бъде копиран. Кльомбата (знак "ет") има отношение само към функцията, така че бихме могли без притеснение да направим проверка дали копирането е било успешно или не:

if(@copy($iztochnik, $cel))

Дефинираме и 2 променливи: $raport и $alert, които в началото на скрипта са със стойност 0 като със $raport ще сеотброяват успешните копирания, а със $alert - неуспешните. В зависимост от изпълнението на функцията стойността на една от двете променливи ще расте.

Тъй като може би ще копирате доста файлове (в моя случай "овършах" над 3 000 (вкл тумбнейлите) от галерията на един мил немски фотограф, който искаше да му се плаща за същото нещо, което пред 6-7 г предоставяше безплатно) добре е в случаите на неуспешно копиране имената на файловете да бъдат запазвани някъде. В нашия случай това е файлът alert.txt

Последната особеност на този скрипт е, че той ще се изпълнява не от операционната ви система, а от локалния ви Апач-сървър. По подразбиране сървърът ще спре изпълнението, ако по някаква приочина скриптът ангажира повече от 30-сек процесорно време.
За да не се случи това (а и за да можем да следим процеса), разделяме цялата работата на по-малки части.

Разделянето напомня на страницирането - преброяват се всички налични елементи в масива fm[] (образуван при четенто на адресите в abc.txt), делят се на броя файлове, които ще се копират при една операция (в случая 10 -> $broinastranica = 10;). Полученото число е общия брой изпълнения на скрипта, които ще са нужни за да се копират всички файлове -> $maxPage

$maxPage = ceil($kolko/$broinastranica);

Използваме условието:

if ($pageNum < $maxPage)

където $pageNum е текущата страница (текущото изпълнение) и заявка за рефреш в хедъра:

header( "refresh: ".(5)."; url= ". "$self?page=$page&raport=$raport&alert=$alert" );

за да продължаваме изпълнението на скрипта докато не бъдат копирани всички адреси.
При рефреша използваме и предаване чрез ГЕТ-метода на няколко променливи: за текуща страница, за бр на копираните файлове и за грешките.

След всяко изпълнение изписваме моментния резултат.

Щом всички файлове бъдат копирани (или по-точно преминат през скрипта), условието което включва рефреша няма да бъде вярно и скриптът сам ще спре своята работа.

Това е. Демо по обясними причини няма как дам :)


УРОКЪТ Е СПЕЦИАЛНО НАПИСАН ЗА УЕБ-ТУРИСТ!


КОМЕНТАР / Трябва да сте регистриран за да напишете коментар /