Ответ 1
Убедитесь, что веб-сервер имеет разрешения на запись в каталог "images/"
Я использую следующий код, и он успешно загружает файлы на моем локальном компьютере. Он показывает "Успешно загружен" на моем локальном компьютере.
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded";
}
Но когда я использовал этот код на моем онлайн-сервере, он не загружает файл и просто показывает сообщение "Не загружено".
Как я могу узнать, в чем проблема, и как я могу получить актуальную проблему для пользователя?
Убедитесь, что веб-сервер имеет разрешения на запись в каталог "images/"
Измените код следующим образом:
// 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() может помочь.
Попробуйте следующее:
$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.';
}
Это мгновенно будет отмечать любые ошибки разрешения файлов.
Как я могу узнать, в чем проблема?
Легко. Обратитесь к журналу ошибок веб-сервера.
как я могу получить актуальную проблему для пользователя?
НИКОГДА сделать это.
Средний пользователь не сможет ничего понять об этой ошибке.
Злоумышленник не должен получать обратную связь, особенно в форме очень информативного сообщения об ошибке.
Просто покажите страницу с отговорками.
Если у вас нет доступа к журналу ошибок сервера, ваша задача становится более сложной.
Существует несколько способов связаться с сообщениями об ошибках.
Чтобы отображать сообщения об ошибках на экране, вы можете добавить эти строки в код
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()
вернется:
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
Вы проверяете, что файл загружен нормально? Возможно, вы превысили 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
ошибка возврата.
PS: Я искал это в течение долгого времени:)
Пожалуйста, проверьте разрешение "images/" каталог
Я столкнулся с очень непонятной и досадной причиной ошибки 6. После того, как некоторые дурачились с томами, смонтированными в NFS, загрузка стала завершаться неудачно. Проблема решена путем перезапуска служб
systemctl restart php-fpm.service
systemctl restart httpd.service