Ошибка 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"; } 

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

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

Related of "Ошибка PHP move_uploaded_file ()?"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ps aux | grep httpd . Первый столбец – это имя пользователя.

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

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

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

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

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

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

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

enctype="multipart/form-data"

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

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

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

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