Привет, я пытаюсь загрузить изображение, используя 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); } }
if($_FILES['image']['type'] == 'image/jpeg'){
Никогда не полагайтесь на тип MIME, предоставляемый браузером.
В этом случае ваша проблема image/pjpeg
тем, что Дэвид ссылается на: IE обычно (ошибочно) поставляет image/pjpeg
для JPEG, поэтому вы обнаруживаете неизвестный image/pjpeg
и устанавливаете ошибку $ error в Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.
Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.
… но тогда, несмотря на это, вы все равно пытаетесь переместить файл в любом случае, несмотря на то, что не задали $ small или $ large.
Но более того, тип, переданный браузером, скорее всего, будет полностью неправильным. Вы не можете доверять загруженному имени файла или типу мультимедиа, чтобы они были подходящими, поэтому даже не утруждайте их проверкой. Вместо этого просмотрите $imgsize[2]
после вашего вызова getimagesize, чтобы узнать, какой тип PHP считает изображением.
И … если вы принимаете загрузки изображений от обычных пользователей, у вас есть проблема с безопасностью. Вполне возможно создать допустимый GIF (или другой тип файла), содержащий HTML-теги. Затем, когда кроваво-глупый-IE приходит, чтобы получить доступ к GIF как к странице самостоятельно, он обнаружит теги HTML, решит, что Content-Type, который вы сказали, должен быть неправильным, и вместо этого интерпретировать его как HTML-страницу, включая любые JavaScript там, который затем выполняется в контексте безопасности вашего сайта.
Если вы должны разрешить загрузку файлов из ненадежного источника, и вы сами не обрабатываете изображения (что обычно связано с побочным эффектом удаления нежелательного HTML), вам обычно приходится показывать изображения с другого имени хоста, чтобы избежать их сценариев на ваш сайт.
if($FILES['image']['type'] == 'image/jpeg'){
Переменная, которая содержит данные для загрузки файлов, должна быть $_FILES
. Так как $FILES
– это пустая (только использованная) переменная, ваша $large
переменная также пуста, поэтому вы перемещаете файл на pictures/
которые являются каталогами, точно так же, как сказал вам PHP. Ваша $error
должна также содержать сообщение об ошибке, так как ни один из символов ifs не является истинным.
Один из способов избежать подобных ошибок состоит в том, чтобы разработать с установкой error_reporting
в E_ALL
, который отобразил бы уведомление о том, что ваша переменная $FILES
(опечатка) не определена.
Вы не можете перемещать каталог, потому что $ large не имеет значения или сбрасывается.