Совсем запутался с загрузкой картинки на сервер при помощи php

barabula

Гуру форума
Регистрация
21 Май 2009
Сообщения
474
Реакции
80
Люди добрые, помогите нубу понять как при помощи пхп загрузить на сервер картинки, а то у меня уже каша какая-то получилась.....
Смысл скрипта таков:
1. Есть файл индекс.пхп, в котором находится только форма для отправки изображения и ничего больше.
2. Есть файл upload.php в котором происходит обработка, проверки и т.д. эти проверки я сам сделаю, расскажите мне как отправленная через формку картинка попадает в переменную, и как её скопировать в папку upload (см.п.3)
3. Есть папка upload, в которой хранятся все загружённые картинки.
 
все через $_FILES *** скрытое содержание ***
Это я знаю, я её и юзаю, и эту статью читал, и даже текстовый документ во временное хранилище загружалось без проблем, но вот графический файл отправить, и чтобы он сохранился в нужной мне папке, не получается. По этому прошу помочь, написать код, желательно с комментариями. Для знающих людей, там делов на 10-15 минут.
Могу скинуть код того, что я наработал, но т.к. в пхп я не профи, и токльо учусь, то там получилась каша полная в конечном итоге, а всё это из за того, что я пробовал по разным примерам воплотить код в жизнь :)
 
ну вот как-то так
PHP:
<?php 
if(!$_FILES['img']){
?>
<form action="" method="post" enctype="multipart/form-data">
<input name="img" type="file" />
<input name="submit" type="submit" value="OK" />
</form>
<?php }
else{
if($_FILES['img']['error']==0 && $_FILES['img']['size']>0){
$size=getimagesize($_FILES["img"]["tmp_name"]);
if($size['mime']=="image/gif")$ext="gif";
elseif($size['mime']=="image/jpeg")$ext="jpeg";
elseif($size['mime']=="image/png")$ext="png";
else{echo "Файл имеет неправельный формат"; die();}	
copy($_FILES['img']['tmp_name'],'upload/'.$_FILES['img']['name']);
echo "Файл успешно загружен!";
}}
?>
 
ну вот как-то так
PHP:
<?php 
if(!$_FILES['img']){
?>
<form action="" method="post" enctype="multipart/form-data">
<input name="img" type="file" />
<input name="submit" type="submit" value="OK" />
</form>
<?php }
else{
if($_FILES['img']['error']==0 && $_FILES['img']['size']>0){
$size=getimagesize($_FILES["img"]["tmp_name"]);
if($size['mime']=="image/gif")$ext="gif";
elseif($size['mime']=="image/jpeg")$ext="jpeg";
elseif($size['mime']=="image/png")$ext="png";
else{echo "Файл имеет неправельный формат"; die();}	
copy($_FILES['img']['tmp_name'],'upload/'.$_FILES['img']['name']);
echo "Файл успешно загружен!";
}}
?>
Спасибо, как раз то что нужно, я кстати что-то на подобе такого делал, но видно где-то упустил деталь, и в итоге не получилось.
Кстати интересует ещё такой нюанс, что значит в этой строке:
$size=getimagesize($_FILES["img"]["tmp_name"]); то что выделеном красным?
 
Кстати интересует ещё такой нюанс, что значит в этой строке:
$size=getimagesize($_FILES["img"]["tmp_name"]); то что выделеном красным?
функция возвращает различные параметры изображения в виде массива(размеры,тип..) в принципе в данном случае используется для определения разрешения файла, можно было скажем создать файл с новым именем copy($_FILES['img']['tmp_name'],'upload/'.$new_name.'.'.$ext);
 
copy вполне можно заменить на move_uploaded_file
и добавить еще проверку что временный файл действительно загружен методом пост, is_uploaded_file, примерно так
PHP:
$tmp_file=$_FILES['img']['tmp_name'];
$up_file='./upload/'.$_FILES['img']['name'];
if (is_uploaded_file($tmp_file) && move_uploaded_file($tmp_file, $up_file)) echo "Ok!";
 
copy вполне можно заменить на move_uploaded_file
и добавить еще проверку что временный файл действительно загружен методом пост, is_uploaded_file, примерно так
PHP:
$tmp_file=$_FILES['img']['tmp_name'];
$up_file='./upload/'.$_FILES['img']['name'];
if (is_uploaded_file($tmp_file) && move_uploaded_file($tmp_file, $up_file)) echo "Ok!";
Мне как раз таки сегодня знакомый расказал что сору уже в таких целях не юзают, для этого есть move_uploaded_file.

Возник ещё вопрос, есть множество вариантов ограничения формата, я их все просмотрел, но не могу понять почему не работает именно мой вариант.
Я составил функцию:
PHP:
function format_file($file)
{
	
switch ($_FILES['image']['type']){
case 'image/gif':
case 'image/jpeg':
  return;
  break;
default:
die("Этот формат не поддерживается");
}
}
Но почему-то формат гиф пропускает а формат джпег не хочет..... дургие форматы тоже не пускает как и было задумано, но вот джпег должно прпоускать.
 
При отладке скриптов полезно понимать что вы отсылаете на сервер
заполняя поля в той или иной форме, для этого очень полезен
плугин к файрфоксе лайв хедерс

устновив этот плугин, заполнив форму и тыкнув сабмит вы увидите
что то такое

Код:
---- POST DATA:

-----------------------------2421143106617
Content-Disposition: form-data; name="uploadfile"; filename="file.txt"
Content-Type: text/plain

'Hello!!!'
-----------------------------2421143106617--
при этом на сервере создасться такой массив
Код:
Array
(
    [uploadfile] => Array
        (
            [name] => index_pma.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpseUm44
            [error] => 0
            [size] => 33
        )

)

то есть отправка файла формой это по сути отсылка многострочного пост запроса, ну и если кто то будет слать
эти данные не формой а на прямую, то он сможет сделать
поле [type]( text/plain) любым, и тем самым обойдет вашу замечательную проверку, даже если вы ее мужествено доделаете..
 
При отладке скриптов полезно понимать что вы отсылаете на сервер
заполняя поля в той или иной форме, для этого очень полезен
плугин к файрфоксе лайв хедерс
*** скрытое содержание ***
устновив этот плугин, заполнив форму и тыкнув сабмит вы увидите
что то такое
Код:
---- POST DATA:
-----------------------------2421143106617
Content-Disposition: form-data; name="uploadfile"; filename="file.txt"
Content-Type: text/plain
'Hello!!!'
-----------------------------2421143106617--
при этом на сервере создасться такой массив
Код:
Array
(
    [uploadfile] => Array
        (
            [name] => index_pma.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpseUm44
            [error] => 0
            [size] => 33
        )
)
то есть отправка файла формой это по сути отсылка многострочного пост запроса, ну и если кто то будет слать
эти данные не формой а на прямую, то он сможет сделать
поле [type]( text/plain) любым, и тем самым обойдет вашу замечательную проверку, даже если вы ее мужествено доделаете..
Я же написал выше что знаю и другие варианты решения этой проблемы, и знаю что тут есть уязвимости. Меня интересует в данном случае не безопастнгсть кода, а то, почему он не работает так как задано в условие. На этот вопрос , вы мне можете дать ответ?
 
Назад
Сверху