Подтвердить что ты не робот

Ошибка PHP move_uploaded_file()?

Я использую следующий код, и он успешно загружает файлы на моем локальном компьютере. Он показывает "Успешно загружен" на моем локальном компьютере.

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded";
}

Но когда я использовал этот код на моем онлайн-сервере, он не загружает файл и просто показывает сообщение "Не загружено".

Как я могу узнать, в чем проблема, и как я могу получить актуальную проблему для пользователя?

4b9b3361

Ответ 1

Убедитесь, что веб-сервер имеет разрешения на запись в каталог "images/"

Ответ 2

Измените код следующим образом:

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded because of error #".$_FILES["file"]["error"];
}

Это даст вам одно из следующих значений кода ошибки от 1 до 8:

UPLOAD_ERR_INI_SIZE = Значение: 1; Загруженный файл превышает директиву upload_max_filesize в php.ini.

UPLOAD_ERR_FORM_SIZE = Значение: 2; Загруженный файл превышает директиву MAX_FILE_SIZE, указанную в форме HTML.

UPLOAD_ERR_PARTIAL = Значение: 3; Загруженный файл был загружен только частично.

UPLOAD_ERR_NO_FILE = Значение: 4; Файл не был загружен.

UPLOAD_ERR_NO_TMP_DIR = Значение: 6; Отсутствует временная папка. Введено в PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE = Значение: 7; Не удалось записать файл на диск. Введено в PHP 5.1.0.

UPLOAD_ERR_EXTENSION = Значение: 8; Расширение PHP остановило загрузку файла. PHP не позволяет определить, какое расширение привело к остановке загрузки файла; Проверка списка загруженных расширений с помощью phpinfo() может помочь.

Ответ 3

Попробуйте следующее:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/";

if (is_dir($upload_dir) && is_writable($upload_dir)) {
    // do upload logic here
} else {
    echo 'Upload directory is not writable, or does not exist.';
}

Это мгновенно будет отмечать любые ошибки разрешения файлов.

Ответ 4

Как я могу узнать, в чем проблема?

Легко. Обратитесь к журналу ошибок веб-сервера.

как я могу получить актуальную проблему для пользователя?

НИКОГДА сделать это.
Средний пользователь не сможет ничего понять об этой ошибке. Злоумышленник не должен получать обратную связь, особенно в форме очень информативного сообщения об ошибке.

Просто покажите страницу с отговорками.

Если у вас нет доступа к журналу ошибок сервера, ваша задача становится более сложной.
Существует несколько способов связаться с сообщениями об ошибках.

Чтобы отображать сообщения об ошибках на экране, вы можете добавить эти строки в код

ini_set('display_errors',1);
error_reporting(E_ALL);

или создать собственный файл журнала ошибок

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');

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

Ответ 5

move_uploaded_file() вернется:

  • FALSE, если имя файла недействительно
  • FALSE и issue a warning в журнале ошибок, если процесс apache не имеет прав на чтение и запись в исходные или целевые каталоги

Журнал ошибок PHP

Мой журнал ошибок php был: /var/log/httpd/error_log и имел следующие ошибки:

Предупреждение: move_uploaded_file (images/robot.jpg): не удалось открыть поток: разрешение отклонено в /var/www/html/mysite/mohealth.php в строке 78

Предупреждение: move_uploaded_file(): Невозможно переместить '/tmp/phpsKD2Qm' в 'images/robot.jpg' в /var/www/html/mysite/mohealth.php в строке 78

move_uploaded_file() пытается переместить файлы из временного каталога в целевой каталог. Когда процесс apache пытался переместить файлы, он не мог прочитать временное или записать в каталог назначения.

  • Найти, какой пользователь запускает Apache (веб-сервер) Проверьте, какой пользователь выполняет службу apache с помощью этой команды: ps aux | grep httpd. Первый столбец - это имя пользователя.

  • Проверить разрешение на чтение во временном каталоге:. Вы можете найти путь к вашему временному директорию, набрав echo sys_get_tmp_dir(); на странице php. Затем в командной строке введите ls -ld /tmp/temporary-dir, чтобы узнать, имеет ли пользователь apache доступ к чтению здесь

  • Проверить разрешение записи в папке Destination Dir: ls -ld /var/www/html/destination-directory, чтобы узнать, имеет ли пользователь apache доступ к записи здесь

  • При необходимости добавьте разрешения, используя chown или chgrp

  • Перезапустить Apache с помощью sudo service httpd restart

Ответ 6

Вы проверяете, что файл загружен нормально? Возможно, вы превысили max_post_size или max_upload_filesize. При входе в систему с помощью FileZilla вы копируете файлы, как вы, при загрузке с помощью PHP wiritng этот файл принадлежит пользователю, который запускает apache (для exaplme www-data), попробуйте поместить chmod 755 для изображений.

Ответ 7

или запустите suexec и больше не нужно менять разрешения.

Ответ 8

Убедитесь, что тэг form имеет этот атрибут:

enctype="multipart/form-data"

Ответ 9

$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/';
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"]))
{
    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic);
    if($moved)
    {
        echo "sucess";
    }
    else
    {
        echo 'failed';
    }
}

Ответ 10

На виртуальном хостинге проверьте disk quota.

если превышение квоты, move_uploaded_file ошибка возврата.

PS: Я искал это в течение долгого времени:)

Ответ 11

Пожалуйста, проверьте разрешение "images/" каталог

Ответ 12

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

systemctl restart php-fpm.service
systemctl restart httpd.service