PHP move_uploaded_file () ошибка? - PullRequest
       6

PHP move_uploaded_file () ошибка?

28 голосов
/ 17 августа 2010

Я использую следующий код, и он успешно загружает файлы на мою локальную машину.На моем локальном компьютере отображается «Успешно загружено».

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

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

Но когда я использовал этот код на своем онлайн-сервере, он не загружает файл, а просто показывает сообщение «Не загружено».1005 * Как я могу узнать, в чем проблема, и как я могу отобразить фактическую проблему для пользователя?

Ответы [ 12 ]

41 голосов
/ 18 июня 2015

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

// 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 () может помочь.

38 голосов
/ 17 августа 2010

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

34 голосов
/ 17 августа 2010

Попробуйте это:

$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.';
}

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

16 голосов
/ 17 августа 2010

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

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

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

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

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

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

Для отображения сообщений об ошибках на экране вы можете добавить эти строки к коду

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

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

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

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

6 голосов
/ 09 апреля 2015

move_uploaded_file() вернет:

  1. FALSE если имя файла неверно
  2. 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 пытался переместить файлы, он не мог прочитать временный файл или записать его в каталог назначения.

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

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

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

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

  5. Перезапустите Apache , используя sudo service httpd restart

2 голосов
/ 17 августа 2010

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

1 голос
/ 09 февраля 2012

или запустите suexec, и вам больше никогда не придется менять разрешения.

0 голосов
/ 06 апреля 2019

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

systemctl restart php-fpm.service
systemctl restart httpd.service
0 голосов
/ 05 апреля 2018

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

0 голосов
/ 27 ноября 2017

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

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

PS: я давно это искал1007 *

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