Настройка Макс.Размер файла для загрузки файлов возвращает пустую страницу после загрузки - PullRequest
0 голосов
/ 04 октября 2011

ОБНОВЛЕНИЕ : Я немного очистил форму и проверку изображения.Я отказался от первоначального подхода к поиску расширения изображения и продолжил, сначала проверив, что загруженный файл был изображением, используя getimagesize ().Оттуда я убедился, что изображение было в формате jpg или .jpeg, взяв расширение с помощью pathinfo () и сопоставив его с массивом, содержащим jpg и jpeg.

Затем я убедился, что файл был успешно загружен изатем успешно переместился из временного местоположения в мое местоположение, которое я установил.Следующим шагом было создание нового изображения с использованием «imagecreatefromjpeg», но я получил ошибку

Неустранимая ошибка: допустимый объем памяти 33554432 байта исчерпан (попытался выделить 13056 байтов) в файле FILENAME.php на линии48

Вот где я запутался, потому что изображение, которое я пытался загрузить, намного меньше моего максимального размера файла 2 МБ (изображение 410 КБ).Не совсем уверен, почему он превышает 32 МБ памяти, на которой находится мой сервер.

    <?php

if(isset($_POST['uploadImage'])){

    //  set variables for uploaded file
    $uploadTempPath = $_FILES['uploadFile']['tmp_name'];
    $uploadSize = $_FILES['uploadFile']['size'];
    $uploadLimit = 2097152; /* 2mb max file size */
    $uploadName = strtolower($_FILES['uploadFile']['name']);    // grab upload filename and lowercase the extension (.JPG -> .jpg)

    //  check if something was uploaded
    if (empty($uploadTempPath)){
        echo '<script language="JavaScript">';
        echo 'alert("You did not upload anything!!")';
        echo '</script>'; 
        $errors .= 'You did not upload an image <br>';
    }

    // if all required fields were filled and a file was actually selected to upload
    if (empty($errors)) :

        //  1A.  Check that file uplaoded is a valid image
        if ( getimagesize($_FILES['uploadFile']['tmp_name']) ) :

            //  2B.  Verify that image extension was a jpg or jpeg
            $imgExt = pathinfo( $_FILES['uploadFile']['name'] , PATHINFO_EXTENSION );
            $validExt = array( 'jpg', 'jpeg' );
            if ( in_array($imgExt, $validExt) ) :

                //  3A.  Make sure image was uploaded successfully
                if (is_uploaded_file($_FILES['uploadFile']['tmp_name'])) :

                    $uploadPath = 'images/uploads/';
                    $imgWidth = '620';
                    $imgFilename = pathinfo( $_FILES['uploadFile']['name'] , PATHINFO_BASENAME );
                    $newPath = $uploadPath . $imgFilename;

                    //  4A.  Move uploaded file from temporary path to new path
                    if(move_uploaded_file ($uploadTempPath , $newPath)) :

                        $img = imagecreatefromjpeg($newPath);

                        // PRINT OUT INFORMATION IF ALL IS CORRECT SO FAR
                        echo 'File was moved <br>'; 
                        echo 'Maximum file size: ' . $uploadLimit . '<br>';
                        echo 'Uploaded file size: ' . $uploadSize . '<br>';
                        echo 'Filename: ' . $imgFilename . '<br>';
                        echo 'New Path: ' . $newPath . '<br>';
                        echo 'File extension: ' . pathinfo($_FILES['uploadFile']['name'], PATHINFO_EXTENSION) . '<br>';

                    //  4B.  Image was not successful in being moved
                    else : 

                        echo 'Image was NOT moved! <br>'; 

                    endif; //  END 4

                //  3B.  Image was not uploaded.. 
                else :

                    // beware of an ATTACK!
                    echo 'Image was not uploaded. <br>';

                endif; //  END 3

            //  2B.  File was not a jpg or jpeg 
            else :

                echo '<script language="JavaScript">';
                echo 'alert("Your image is not a jpeg! Its a ' . pathinfo($_FILES['uploadFile']['name'] , PATHINFO_EXTENSION) . '")';
                echo '</script>'; 
                $errors .= 'NOT A JPEG! <br>';

            endif; //  END 2

        //  1B.  File uploaded was not a valid image
        else :

            echo '<script language="JavaScript">';
            echo 'alert("Invalid Image!")';
            echo '</script>'; 
            $errors .= 'The file you uploaded is not a valid image file <br>';

        endif; //  END 1

    endif; // endif empty errors

}   

?>

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

Расширяя мой комментарий, вы не прекращаете выполнение скрипта, если сталкиваетесь с ошибкой, такой как максимальный размер файла. Не полагайтесь на html-форму, чтобы фактически остановить загрузку (что, кстати, происходит молча), если изображения больше, чем разрешено. А в вашем php вы просто создаете индекс ошибки, но тем не менее продолжаете манипулировать изображением.

Кроме того, проверка вашего изображения очень плохая по нескольким причинам:

1) соответствие preg, если оно содержит расширение, является ОЧЕНЬ ПЛОХОЙ проверкой , если ее вообще нет.

Попробуйте загрузить shell.php.jpg, и вы поймете, почему;) Один из лучших способов проверить, является ли изображение допустимым, - использовать getimagesize () , который дает вам массив из 7 элементов со множеством полезной информации, а также говорит о том, что изображение является истинным изображением.

Что если я сохраню изображение jpg с расширением png? Я обманываю ваш скрипт, чтобы найти png, а вместо этого он будет jpg. Это легко сломает вашу функцию создания изображения.

2) Ваш способ получить расширение неверен, файл типа my.picture.jpg просто сломает его.

Вы можете использовать pathinfo ($ file, PATHINFO_EXTENSION) , чтобы получить эту информацию; эта функция также получит правильное имя файла, dirpath и т. д., и она более надежна, чем любая домашняя зачистка, чередование и тому подобное

3) PNG и GIF должны требовать дополнительного лечения, например с сохранением альфа-канала ; Вы потеряете прозрачность своих изображений вот так.

Чтобы увеличить предел памяти, используйте ini_set("memory_limit","VALUE HERE"), как предложено. Но имейте в виду, что обычно это не проблема в случае небольших изображений, поэтому есть что-то еще, что вызывает проблемы. Если вы исправите код там, вам даже не понадобится использовать этот «хак»; кроме того, его расширение означает, что вы выделяете больше ресурсов (чем должно быть выделено), и ваш скрипт может не потерпеть неудачу, но это не означает, что ваш скрипт лучше

О, еще один: случайно ли вы храните изображение в базе данных как поле BLOB-объектов? (неясно, что вы делаете со своим оператором INSERT). Я предлагаю просто сохранить путь к varchar в вашей БД по ряду причин (производительность, целостность данных и т. Д.), Вставка целых двоичных файлов изображения в поле базы данных - не лучшая стратегия.

0 голосов
/ 04 октября 2011

Прежде всего давайте исправим некоторые незначительные ошибки: вы должны экранировать точку в регулярном выражении имени файла, чтобы она соответствовала фактическому периоду; тогда вам следует проверить и создать каталог $ uploadNewPath до того, как вы его на самом деле используете. И вы можете попытаться использовать imagecreatefromX для файлов tmp, фактически не перемещая их в новое место, потому что вы пытаетесь перезаписать их новым измененным размером изображения.

0 голосов
/ 04 октября 2011

это потому, что весь файл входит в кеш как переменная.
Попробуйте загрузить уменьшенное изображение, и вы увидите, что оно работает нормально.

ну, вам нужно увеличить объем памяти. но это то, что вы должны дважды подумать, прежде чем делать это (безопасность).

ini_set("memory_limit","350M");// or any thing you want here

//run the script here...

ini_set("memory_limit","128M");//back to normal
...