Проблемы с загрузкой файлов в PHP - PullRequest
1 голос
/ 23 октября 2009

Привет, я пытаюсь загрузить изображение, используя скрипт php. И что действительно странно, так это то, что я получаю следующую ошибку только в Internet Explorer везде, где скрипт работает нормально:

Warning: move_uploaded_file(pictures/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/tntauto1/public_html/admin_add1.php on line 59

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpcJnHZE' to 'pictures/' in /home/tntauto1/public_html/admin_add1.php on line 59

Warning: copy() [function.copy]: The first argument to copy() function cannot be a directory in /home/tntauto1/public_html/admin_add1.php on line 60

Вот сценарий:

if(is_uploaded_file($_FILES['image']['tmp_name'])){
    if($_FILES['image']['type'] == 'image/jpeg'){
        $original = 'original_'.$v_id.'.jpg';
        $large = 'large_'.$v_id.'.jpg';
        $small = 'small_'.$v_id.'.jpg';

    }elseif($_FILES['image']['type'] == 'image/gif'){
        $original = 'original_'.$v_id.'.gif';
        $large = 'large_'.$v_id.'.gif';
        $small = 'small_'.$v_id.'.gif';
    }else{
        $error = 'Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.';
    }
    if(move_uploaded_file($_FILES['image']['tmp_name'],'pictures/'.$large)){}
        copy('pictures/'.$large,'pictures/'.$small);

    $imgsize = getimagesize('pictures/'.$large); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>---- Resize to 480 X 360
    $width = $imgsize[0];
    $height = $imgsize[1];
    if(($width > 480) || ($height > 360)){//resize the image
        $ratio = $width / $height;
        if(100 / $ratio >= 80){//calculates if height of uploaded image is too large
            $new_width = floor(360 * $ratio);
            $new_height = 360;
        }elseif(150 * $ratio > 100){// calculate if width of uploaded image is too large
            $new_width = 480;
            $new_height = floor(480 / $ratio);
        }
        if($_FILES['image']['type'] == 'image/jpeg'){
            $img = imagecreatefromjpeg('pictures/'.$large);
            $img_copy = imagecreatetruecolor($new_width,$new_height);
            imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height);
            imagejpeg($img_copy,'pictures/'.$large,100);    
        }
        if($_FILES['image']['type'] == 'image/gif'){
            $img = imagecreatefromjpeg('pictures/'.$large);
            $img_copy = imagecreatetruecolor($new_width,$new_height);
            imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height);
            imagejpeg($img_copy,'pictures/'.$large,100);    
        }
    }   

Ответы [ 3 ]

6 голосов
/ 23 октября 2009
if($_FILES['image']['type'] == 'image/jpeg'){

Никогда не полагайтесь на тип MIME, предоставленный браузером.

В этом случае ваша проблема, на которую ссылается Дэвид: IE обычно (ошибочно) предоставляет image/pjpeg для JPEG, поэтому вы обнаруживаете неизвестный тип файла и устанавливаете $ error на Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format. ... но, несмотря на это, вы все равно попробуйте переместить файл, несмотря на то, что он не установил $ small или $ large.

Но более того, представленный браузером тип, вероятно, будет полностью неверным. Вы не можете доверять загруженному имени файла или типу носителя, так что даже не проверяйте их. Вместо этого посмотрите на $imgsize[2] после вашего вызова getimagesize, чтобы узнать, какой тип PHP думает, что изображение.

И ... если вы принимаете загрузки изображений от обычных пользователей, у вас есть проблемы с безопасностью. Вполне возможно создать действительный GIF (или другой тип файла), который содержит теги HTML. Затем, когда приходит bloody-stupid-IE для доступа к GIF как к отдельной странице, он обнаружит теги HTML, решит, что тип контента, который вы сказали, что он неправильный, и вместо этого интерпретирует его как страницу HTML, включая любые Там есть JavaScript, который затем выполняется в контексте безопасности вашего сайта.

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

3 голосов
/ 23 октября 2009
if($FILES['image']['type'] == 'image/jpeg'){

Переменная, которая содержит данные загрузки файла, должна быть $_FILES. Поскольку $FILES является пустой (только что использованной) переменной, ваша переменная $large также пуста, поэтому вы перемещаете файл в pictures/, который является каталогом, как вам сказал PHP. Ваш $error также должен содержать сообщение об ошибке, поскольку ни один из символов if перед ним не имеет значения true.

Одним из способов избежать подобных ошибок является разработка с error_reporting, установленным на E_ALL, который бы отображал уведомление о том, что ваша переменная $FILES (опечатка) не определена.

0 голосов
/ 23 октября 2009

Вы не можете переместить каталог, потому что $ large не имеет значения или сбрасывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...