Я так понимаю тебе нужно загружать именно картинки. Я тебе кину сокращенный вариант того, как реализована загрузка картинок тут (сократил несколько проверок на правильность загружаемого файла). Для начала немного информации. Прежде всего форма должна быть определена вот так: <form action=photo.php method=post enctype="multipart/form-data">
"enctype="multipart/form-data" " как раз говорит о том, чтобы данные из формы передавались в том виде, в котором может быть передана нетекстовая информация (например, файл). На домашнем сервере может у тебя и работало без этого, но в принципе это необходимо указывать.
Далее. При постировании используя РНР желательно также добавить спрятанную переменную MAX_FILE_SIZE, в которой нужно указать максимальный допустимый размер загружаемого файла (в байтах):
<input type="hidden" name="MAX_FILE_SIZE" value="400000">
В примере, который я привел, я заранее указываю заведомо бОльший размер, потому что настоящую проверку я делаю "вручную" - это позволяет выдать соответствующее предупреждение юзеру. У меня лично не получилось отловить тот случай, когда юзер пытается загрузить файл с размером больше, чем MAX_FILE_SIZE - страница просто "зависала". Именно поэтому я и указываю заведомо больший размер, чтобы проверить потом "вручную".
Теперь непосредственно о том, как в РНР обрабатывается загружаемый файл. По идее самый надежный способ (особенно, когда загружаются несколько файлов) это использовать $HTTP_POST_FILES array. В частности в твоем примере тебе нужно использовать $HTTP_POST_FILES["File"], потому что в твоем примере поле загружаемого файла в форме называется "File". $HTTP_POST_FILES["File"] - это тоже array и он содержит следующие поля:
$HTTP_POST_FILES["File"]["name"] - оригинальное имя файла (то, какое оно было у клиента) $HTTP_POST_FILES["File"]["tmp_name"] - полное имя временного файла (т.е. включая полный путь к файлу). При загрузке файл попадает во временную директорию, определенную в настройках РНР и получает временное имя. $HTTP_POST_FILES["File"]["size"] - размер файла в байтах.
Есть, кажется, и еще поля, но в данном случае они не нужны.
В нижеприведенном примере я использую три функции:
1) HandleUplоаdImg () - создает директорию, указанную в $target (если она не существует), вызывает функцию CheckUplоаdImg () (см. ниже) для проверки легитимности загружаемого файла и затем вызывает РНР функцию move_uplоаded_file(<path_to_uplоаded_temporary_file>, <path_to_target_file> ) которая перемещает временный файл в нужное место.
2) CheckUplоаdImg () - проверяет легитимность загружаемого файла. Для начала проверяется расширение файла (допускаются лишь JPG,JPEG,GIF), затем вызывается CheckFileName (см. ниже) для проверки имени файла. Далее проверяется размер файла (переменная $img_max_size содержит максимальный размер загружаемого файла в байтах) и наконец проверяется тип и резолюция картинки. Последнее делается с помощью РНР функции GetImageSize($tmp_name) (не требует подключения GDI библиотеки) которая возвращает array, в котором тебя по сути должно интересовать лишь следующее: $img_info[0] - ширина картинки в пикселях $img_info[1] - высота картинки в пикселях $img_info[2] - тип картинки (значения 1 и 2 - JPG и GIF)
3) CheckFileName ($name) - проверяет легитимность имени загружаемого файла (чтобы не было всяческих эксплоитов типа "../../autoexec.bat" )
А вот сам код:
<?PHP
$WarningStr = ""; $ImgDir = "target"; $img_max_size = 100000; $img_max_x = 600; $img_max_y = 600;
//----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- function CheckFileName ($name) { GLOBAL $WarningStr; if (strstr ($name, ".." )) { $WarningStr = "Неправильное имя файла!!!"; return FALSE; }
for ($i=0; $i < strlen($name); $i++) if ( (($name{$i} < 'a' ) || ($name{$i} > 'z' )) && (($name{$i} < 'A' ) || ($name{$i} > 'Z' )) && (($name{$i} < '0' ) || ($name{$i} > '9' )) && ($name{$i} != '.' ) && ($name{$i} != '_' ) && ($name{$i} != '-' ) ) { $WarningStr = "Неправильное имя файла (только латинские буквы и цифры)!!!"; return FALSE; }
return TRUE; } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- function CheckUplоаdImg () { GLOBAL $HTTP_POST_FILES; GLOBAL $WarningStr; GLOBAL $img_max_size; GLOBAL $img_max_x; GLOBAL $img_max_y;
$name = $HTTP_POST_FILES["File"]["name"]; $tmp_name = $HTTP_POST_FILES["File"]["tmp_name"]; //-------------------------- // Checking file extension //-------------------------- $ext = strtoupper (substr(strrchr($name, "." ),1)); if ( ($ext != "JPEG" ) && ($ext != "JPG" ) && ($ext != "GIF" ) ) { $WarningStr = "Неправильный тип файла (".$ext." )!!!"; return FALSE; } //-------------------------- // Checking file name //-------------------------- if (!CheckFileName ($name)) return FALSE;
//-------------------------- // Checking file size //-------------------------- if ($HTTP_POST_FILES["File"]["size"] > $img_max_size) { $WarningStr = "Размер файла не должен превышать ".($img_max_size/1000)."КБ!!!"; return FALSE; }
//-------------------------- // Checking image dimensions & type //--------------------------
$img_info = GetImageSize($tmp_name); if (!$img_info) { $WarningStr = "Ошибка чтения временного файла!!!"; return FALSE; } if ( ($img_info[2] != 1) && ($img_info[2]!= 2) ) { $WarningStr = "Неправильный тип файла!!!"; return FALSE; } if ( ($img_info[0]>$img_max_x) || ($img_info[1]>$img_max_y) ) { $WarningStr = "Размер картинки не должен превышать $img_max_x$img_max_y пикселей!!!"; return FALSE; } return TRUE; } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- function HandleUplоаdImg () { GLOBAL $ImgDir; GLOBAL $HTTP_POST_FILES; GLOBAL $WarningStr;
if (is_uplоаded_file($HTTP_POST_FILES["File"]["tmp_name"])) { //-------------------------------- // create target dir if necessary //-------------------------------- if (!is_dir($ImgDir)) { if (!mkdir ($ImgDir, 0700)) { $WarningStr = "Ошибка создания директории!!!"; return FALSE; } } //-------------------------------- // Check uplоаded file //-------------------------------- if (!CheckUplоаdImg ()) return FALSE;
//-------------------------------- // Move uplоаded file //-------------------------------- move_uplоаded_file($HTTP_POST_FILES["File"]["tmp_name"], $ImgDir."/".$HTTP_POST_FILES["File"]["name"]); } else { $WarningStr = "Системная ошибка (возможная атака)!!!"; return FALSE; } return TRUE; } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //-----------------------------------------------------------------------
if (array_key_exists ("File", $HTTP_POST_FILES)) HandleUplоаdImg();
?>
<body>
<?PHP if ($WarningStr != "" ) print("<FONT COLOR=#FF0000><B>$WarningStr</B></FONT><BR><BR>\n" ); ?>
<form action=photo.php method=post enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="400000"> <input type=file name=File> <br> <input type=submit name=doUplоаd value="Uplоаd"> </form>
</body> |