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

Тема в разделе "PHP", создана пользователем barabula, 2 окт 2011.

Модераторы: latteo
  1. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Люди добрые, помогите нубу понять как при помощи пхп загрузить на сервер картинки, а то у меня уже каша какая-то получилась.....
    Смысл скрипта таков:
    1. Есть файл индекс.пхп, в котором находится только форма для отправки изображения и ничего больше.
    2. Есть файл upload.php в котором происходит обработка, проверки и т.д. эти проверки я сам сделаю, расскажите мне как отправленная через формку картинка попадает в переменную, и как её скопировать в папку upload (см.п.3)
    3. Есть папка upload, в которой хранятся все загружённые картинки.
     
  2. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.035
    Симпатии:
    703
  3. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Это я знаю, я её и юзаю, и эту статью читал, и даже текстовый документ во временное хранилище загружалось без проблем, но вот графический файл отправить, и чтобы он сохранился в нужной мне папке, не получается. По этому прошу помочь, написать код, желательно с комментариями. Для знающих людей, там делов на 10-15 минут.
    Могу скинуть код того, что я наработал, но т.к. в пхп я не профи, и токльо учусь, то там получилась каша полная в конечном итоге, а всё это из за того, что я пробовал по разным примерам воплотить код в жизнь :)
     
  4. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.035
    Симпатии:
    703
    ну вот как-то так
    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']==&& $_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 
    "Файл успешно загружен!";
    }}
    ?>
     
    barabula нравится это.
  5. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Спасибо, как раз то что нужно, я кстати что-то на подобе такого делал, но видно где-то упустил деталь, и в итоге не получилось.
    Кстати интересует ещё такой нюанс, что значит в этой строке:
    $size=getimagesize($_FILES["img"]["tmp_name"]); то что выделеном красным?
     
  6. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.035
    Симпатии:
    703
    функция возвращает различные параметры изображения в виде массива(размеры,тип..) в принципе в данном случае используется для определения разрешения файла, можно было скажем создать файл с новым именем copy($_FILES['img']['tmp_name'],'upload/'.$new_name.'.'.$ext);
     
    barabula нравится это.
  7. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25
    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!";
     
  8. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Мне как раз таки сегодня знакомый расказал что сору уже в таких целях не юзают, для этого есть move_uploaded_file.

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

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25
    При отладке скриптов полезно понимать что вы отсылаете на сервер
    заполняя поля в той или иной форме, для этого очень полезен
    плугин к файрфоксе лайв хедерс

    http://livehttpheaders.mozdev.org/

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

    Код:
    ---- 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) любым, и тем самым обойдет вашу замечательную проверку, даже если вы ее мужествено доделаете..
     
  10. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Я же написал выше что знаю и другие варианты решения этой проблемы, и знаю что тут есть уязвимости. Меня интересует в данном случае не безопастнгсть кода, а то, почему он не работает так как задано в условие. На этот вопрос , вы мне можете дать ответ?