Проблемы с загрузкой файлов в PHP
Привет я пытаюсь загрузить изображение с помощью сценария 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 ответа
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-кода), вам, как правило, приходится обслуживать изображения с другого имени хоста, чтобы избежать их сценариев на ваш сайт.
if($FILES['image']['type'] == 'image/jpeg'){
Переменная, содержащая данные загрузки файла, должна быть $_FILES
, поскольку $FILES
пустая (только что использованная) переменная, ваш $large
переменная также пуста, поэтому вы перемещаете файл в pictures/
это каталог, как сказал вам PHP. Ваш $error
также должен содержать сообщение об ошибке, так как ни один из ifs, прежде чем это правда.
Один из способов избежать подобных ошибок - это разработка с error_reporting
установлен в E_ALL
что бы отобразить уведомление о том, что ваш $FILES
переменная (опечатка) не определена.
Вы не можете переместить каталог, потому что $large не имеет значения или сбрасывается.