Задать вопрос
Lyrium
@Lyrium
Web developer

PHP 5,2: почему временный файл не создается или создается без расширения?

В одном старом сайте нужно сделать загрузку картинки.
На локальном компьютере работает без проблем. На сервере нет. Смотрел где создаются временные файлы (tmp_name), папка chmod -R 0755, менял в php.ini ее местоположение. Без результатов

if( substr($_FILES['img']['type'], 0, 5)=='image' ){

                $path = $_SERVER['DOCUMENT_ROOT'] . '/app/webroot/img/certificate/'; // директория для загрузки
                $ext = array_pop(explode('.',$_FILES['img']['name'])); // расширение
                $new_name = time().'.'.$ext; // новое имя с расширением
                $full_path = $path.$new_name; // полный путь с новым именем и расширением

                if($_FILES['img']['error'] == 0){
                    if(move_uploaded_file($_FILES['img']['tmp_name'], $full_path)){

                        $this->CertificatesNew->query("INSERT INTO certificates_new(title, img) VALUES ('$title', '$new_name');");
                    }
                }

            }else{
                echo 'Не изображение';
            }


суть в том что временный файл вообще не создается, а в $_FILES он без расширения
Array
(
    [img] => Array
        (
            [name] => Ppwqfm_WZqI.jpg
            [type] => image/jpeg
            [tmp_name] => /home/elbase/data/mod-tmp/phpI05aRW
            [error] => 0
            [size] => 57148
        )

)
  • Вопрос задан
  • 641 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
Для умных: воспользоваться отладчиком, и посмотреть по шагам что происходит в вашем коде.

Для усердных: добавить во все if'ы вывод echo с каким-то текстом, как-то так:
if($_FILES['img']['error'] == 0){
                    echo "img error = 0\n";
                    echo "tmp path = {$_FILES['img']['tmp_name']}\n";
                    echo "new path = $full_path\n";
                    if(move_uploaded_file($_FILES['img']['tmp_name'], $full_path)){

                        $this->CertificatesNew->query("INSERT INTO certificates_new(title, img) VALUES ('$title', '$new_name');");
                    } else {
                      echo "move_uploaded_file error";
                    }
                } else {
                    echo "img error = " . $_FILES['img']['error'];
                }

Может там прав на запись нет, или еще какая беда. Некоторым людям проще написать тучу строчек с этими echo чем запустить отладчик.

И да, вам следовало бы предусмотреть что с клиента вам могуть прислать файл без расширения или с двойным расширением "котик.jpg.rar" а внутри файла при этом будет php код, например. И mime type могут подменить на что угодно.
Хорошей практикой является проверка не по расширению а по самому файлу. Вызовом getimagesize() или exif_imagetype().
Ответ написан
Комментировать
djQuery
@djQuery
"Кодируем помаленьку" ("Сказка о Тройке")))
Осталось только использовать move_uploaded_file(... (Пример здесь)
Ответ написан
toxa82
@toxa82
Временный файл всегда создавался без расширения, и удалялся по завершению скрипта. move_uploaded_file вам в помощь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы