Задать вопрос

Загрузка файла на сервер в PHP

Всем привет.

Я в PHP не особо силен, но пролистав несколько страниц гугла я понял что моя ситуация не типичная.

Мне нужно с помощью скрипта загрузить файл на сервер. Для этого я нашел в интернете очень простой html-файл:

<html>
<body>

<form action="upload.php" method="post"
      enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="Submit">
</form>

</body>
</html>


и такой же простой скрипт:

<?php 
$allowedExts = array("jpg", "jpeg", "gif", "png"); 
$extension = end(explode(".", $_FILES["file"]["name"])); 
if ((($_FILES["file"]["type"] == "image/gif") 
    || ($_FILES["file"]["type"] == "image/jpeg") 
    || ($_FILES["file"]["type"] == "image/png") 
    || ($_FILES["file"]["type"] == "image/pjpeg")) 
    && ($_FILES["file"]["size"] < 20000) 
    && in_array($extension, $allowedExts)) 
{ 
    if ($_FILES["file"]["error"] > 0) 
    { 
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; 
    } 
    else 
    { 
        echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
        echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; 
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>"; 

        if (file_exists("upload/" . $_FILES["file"]["name"])) 
        { 
            echo $_FILES["file"]["name"] . " already exists. "; 
        } 
        else 
        { 
            move_uploaded_file($_FILES["file"]["tmp_name"], 
                "upload/" . $_FILES["file"]["name"]); 
            echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
        } 
    } 
} 
else 
{ 
    echo "Invalid file<br />"; 
    print_r($_FILES); 
} 
?>


Как и следовало ожидать — файл не загружается. Вся проблема в том, что в $_FILES[«file»][«error»] ничего не содержится. После «загрузки» массив $_FILES имеет следующий вид:

Array ( [file] => Array ( [name] => avatar-95x95.jpg ) )


в php.ini:

post_max_size = 8M
file_uploads = On
upload_max_filesize = 2M

и т.д., все в общем учтено и все выставлено как нужно.

Картинку я загружаю именно нормальную JPEG, с расширением jpg. Впрочем, даже когда я вообще убираю все эти проверки на тип файла — все равно все то же самое происходит. Пробовал на разных браузерах. Скрипт крутится на моем instance на amazon aws ec2 под управлением SuSE Linux, Apache2.
  • Вопрос задан
  • 44205 просмотров
Подписаться 16 Оценить 2 комментария
Решения вопроса 1
KEKSOV
@KEKSOV
А, все понятно нужно сменить версию PHP. У Вас как раз глючная 5.3.8 установлена
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
dekameron
@dekameron
Запустил ваш же пример. все работает.
Единственное, что пришлось сменить мне:
1. увеличить лимит размера
$_FILES["file"]["size"] < 20000
(19Кб ну очень уже мало)
2.
$extension = strtolower(end(explode(".", $_FILES["file"]["name"])));
(фотка, попавшаяся под руку, имела расширение .JPG, а не .jpg)
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Поглядите phpinfo(), тот ли php.ini вы вообще смотрите и загружены ли новые настройки.
Ответ написан
KEKSOV
@KEKSOV
1. Файл точно меньше 2М?
2. Веб сервер имеет права на запись в /tmp?
Ответ написан
BeLove
@BeLove
security
Никогда, никогда не доверяйте $_FILES[«file»][«type»], так как это не значит ровным счетом ничего. Эти данные приходят из HTTP запроса, которые легко подделать. Проверяйте MIME-тип файла когда он уже лежит локально (php-либами или даже `file — ib image.jpg`.
Но и то, не факт, что там то, что вы определили. Заголовки так же можно подделать, а внутрь поместить php-код.
Ответ написан
semaster
@semaster
Ответ написан
Комментировать
slovoblydie
@slovoblydie
it / web / photography
Да, с версией php есть глюка.
У меня сам код заработал так:

$uploadfile = "upload/".$_FILES['file']['name'];
  move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile);

Так сказать укороченный вариант.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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