Директории (Част 2)

Ъплоуд на файлове


Какво правим, ако ни се наложи да качим файл от локалния си компютър на сървъра? Този файл може да бъде текстов файл, изображение или някакъв друг документ.
За да можем да качим файл, е необходимо да се направят две промени в стандартната HTML форма. На първо място е необходимо тя да съдържа атрибута
enctype= "multipart/form-data"
който казва на сървъра, че се очаква получаване на файл или други данни. Второ, необходим ни е елементът
<input type=file name=name>
който служи за създаване на поле, в което се въвежда точният адрес на файла от локалния диск на компютъра, който ще бъде качен на сървъра. Едва, когато файлът се качи на сървъра, той може да бъде обработен с РНР.

Забележка:

За да можете да качвате файлове на сървъра, е необходимо това да бъде разрешено в конфигурационния файл php.ini. Как да намерим в коя директория се намира php.ini файла? Един от начините е с помощта на командата find, въведена в терминала:
find/
-name 'php.ini' 2> /dev/null
Когато ползвате тази команда, тя може да открие множество php.ini файлове и вие да не знаете кой по-точно е активен в дадения момент, защото се претърсва целия диск. Мястото на този файл зависи от инсталацията на PHP (операционна система, дистрибуция на Линукс).

На моя сървър php.ini файла се намира в директорията /opt/lampp/etc/php.ini.

php_ini.png
Това са настройките по подразбиране.

Директивата file_uploads разрешава (on) или забранява (off) качването на файлове на сървъра.

Директивата upload_tmp_dir указва пътя до директорията, където файлът, който ще се качва, ще бъде временно съхранен, т.е. временната директория за съхранение на файловете на моя сървър е /opt/lampp/temp.

Директивата upload_max_filesize показва файл с какъв максимален размер може да се качи на сървъра.

Ако няма да ви се налага да качвате файлове на сървъра, можете да изключите директивата file_uploads (от съображения за сигурност).

При ъплоуд на файла, сървърът го поставя във временна директория.
Функцията сору () се прилага за копиране на файл от временната директория до място на сървъра, където искаме да се съхрани постоянно. Синтаксисът на функцията е:

bool copy ( string $source , string $dest [, resource $context])

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

$dest- задължителен параметър, показващ пътя до дестинацията (мястото, където ще се създаде копието).

Повече за функцията copy (): http://php.net/
Съществува една малка подробност. :) Ползвайки функцията copy (), е възможно да не успеете да копирате файла, защото нямате позволение за работа с temp директорията на сървъра. В такъв случай има три варианта: първият е да промените правата за достъп за тази директория, вторият е да си създадете нова директория за временно съхраняване на файловете до която да имате достъп чрез промяна на директивата upload_tmp_dir в php.ini файла.Трети вариант- вместо функцията copy () да ползвате функцията move_uploaded_file ().
Вие решавате кой път да изберете. :)
Синтаксисът на функцията move_uploaded_file () е:

bool move_uploaded_file (string $filename, string $destination)

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

$destination- задължителен параметър, показващ къде ще бъде преместен файла.

Функцията move_uploaded_file () проверява дали файлът е качен посредством POST метода на PHP (с метода GET не можете да ъплоуднете файл на сървъра). Тази функция е за предпочитане пред copy () от съображения за сигурност.

Повече за функцията move_uploaded_file: http://php.net/

Ще създадем скрипт, който ще качва файл на сървъра и ще го съхранява в директорията /users/images.
Първо ще създадем формата, с помощта на която ще избираме файл от компютъра.
Отворете текстовия редактор. Създайте нов документ и го наименовайте form_4.html.

Съдържанието на файла form_4.html е:
<!Doctype html>
<html>
<head>
<title>Качване на файл на сървъра</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">

</head>
<body> 

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label>Избери изображение:</label>
    <input type="file" name="fileToUpload" id="fileToUpload" 
           style=" color: transparent;"><br /><br />
    <input type="submit" value="Качи изображението" name="submit">
</form>

</body>
</html>
Съхранете файла form_4.html и го качете на сървъра.
Създайте нов документ и го наименовайте fileUploading.php.

Съдържаниета на файла fileUploading.php е:
<!Doctype html>
<html>
<head>
<title>Качване на файл на сървъра</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>
<?php

if(isset($_POST["submit"])) { //Ако формата е приета
 
//Създава директория image, ако такава не съществува
$dir = "/opt/lampp/htdocs/phpbegin/users/images";

//Проверява дали променливата $dir е директория 
if( is_dir($dir) === false)
{
   //Създава поддиректорията /image
   mkdir($dir, 0777, true);
}

//$_FILES получава името на файла, 
който искаме да качим на сървъра
echo "Името на файла е:" . " " .
$_FILES["fileToUpload"]["name"] . "<br />"; //$_FILES получава размера на файла който искаме да качим на сървъра echo " Размерът на файла е:" . " " .
$_FILES["fileToUpload"]["size"] . "<br />"; //Път до директорията, в която ще съхраняваме файла $target_dir = "/opt/lampp/htdocs/phpbegin/users/images/"; //Тази променлива взема името на файла от посочения до него път в $target_dir $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; //$imageFileType взема разширението на файла $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); //Извежда в екрана на браузъра разширението на файла echo "Разширението на файла е:" . " " . $imageFileType . "<br />"; //Проверява дали изображението е това, което сме избрали //чрез формата или фалшифицирано $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "Файлът е изображение - " . $check["mime"] . ".". "<br />"; $uploadOk = 1; } else { echo "Файлът не е изображение.". "<br />"; $uploadOk = 0; } } //Проверява дали файлът вече съществува в директорията, //посочена като дестинация if (file_exists($target_file)) { echo "Съжаляваме, файлът вече съществува.". "<br />"; $uploadOk = 0; } //Проверява размера на файла и ако той е > от //128 000 000 байта се отхвърля if ($_FILES["fileToUpload"]["size"] > 128000000000) { echo "Съжаляваме, файлът Ви е с размер над допустимия.". "<br />"; $uploadOk = 0; } //Позволява качването само на файлове с разширения
jpg, png, jpeg, gif
if($imageFileType != "jpg" &&
$imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Съжалявам, позволено е само качването на

файлове във формат JPG, JPEG, PNG и GIF.". "<br />";
$uploadOk = 0; } // Проверява дали променливата $uploadOk е 0 if ($uploadOk == 0) { echo "Съжаляваме, файлът Ви не е качен на сървъра.". "<br />"; //Качва файла на сървъра } else { if (move_uploaded_file($_FILES["fileToUpload"]
["tmp_name"], $target_file)) {
echo "Файлът ". basename( $_FILES["fileToUpload"]
["name"]). " беше качен на сървъра.". "<br />";
} else { echo "Съжаляваме, възникна грешка при
качване на файла на сървъра.". "<br />";
} } ?> </body> </html>
Съхранете файла. Качете го на сървъра и тествайте в браузъра.

upload_1.png


upload_2.png


upload_3.png


sign.png

Няма коментари:

Публикуване на коментар