Я использую следующий код, и он успешно загружает файлы на мою локальную машину. Он показывает "Успешно загружено" на моей локальной машине.
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded";
}
Но когда я использую этот код на моем онлайн-сервере, он не загружает файл и просто показывает сообщение "Не загружен".
Как я могу узнать, в чем проблема, и как я могу получить реальную проблему для отображения пользователю?
Измените код следующим образом:
// 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.Ини.
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() может помочь.
Убедитесь, что веб-сервер имеет права на запись в каталог "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.';
}
Это будет мгновенно флаг ошибки доступа к файлу.
Как я могу узнать, в чем проблема?
Легко. Обратитесь к журналу ошибок веб-сервера.
Как я могу получить реальную проблему для отображения пользователю?
НИКОГДА не делайте этого.
Обычный пользователь ничего не поймет из этой ошибки.
Злонамеренный пользователь не должен получить никакой обратной связи, особенно в виде очень информативного сообщения об ошибке.
Просто покажите страницу с оправданиями.
Если у вас нет доступа к журналу ошибок сервера, ваша задача усложняется.
Существует несколько способов получить доступ к сообщениям об ошибках.
Для отображения сообщений об ошибках на экране вы можете добавить в код следующие строки
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
и предупреждение
в журнал ошибок Апача, если процесс не имеет разрешения на чтение/запись источника или назначения каталогахВывод ошибок PHP
Мой журнал ошибок PHP на: `/ВАР/лог/файл httpd/функцию error_log и были эти ошибки:
предупреждение: move_uploaded_file(images/robot.jpg): не удалось открыть поток: разрешение отказано в /var/www/html/mysite/mohealth.php на линии 78
предупреждение: move_uploaded_file(): не удается переместить '/tmp/и phpsKD2Qm' до 'изображений/робот.форматы jpg' в /var/www/html/mysite/mohealth.php на линии 78
`move_uploaded_file () пытается переместить файлы из временного каталога в каталог назначения. Когда процесс Apache пытался переместить файлы, он не мог читать или писать временного назначения реж.
Найти пользователя работает Apache (веб-сервер)
Проверить, какой пользователь запускает службу Apache командой: ПС вход aux | grep в файл httpd
. Первая колонка это имя пользователя.
Проверьте разрешения на временное реж: ваш может найти путь в свой временный каталог при вызове Эхо sys_get_tmp_dir (); в PHP-страницы. Затем в командной строке, вопрос
ЛС-ЛД /tmp/и временные-реж`, чтобы увидеть, если Apache пользователь имеет доступ для чтения здесь
Проверьте разрешения на запись в пункт назначения реж: выпуск `ЛС-лд в /var/www в/HTML-код/назначения-справочник, чтобы увидеть, если Apache пользователь имеет доступ на запись здесь
Добавить разрешения, а также с помощью Краун
или команда chgrp
Перезапустите Apache с помощью судо служба httpd "рестарт"
Проверяете ли вы, что файл загружен нормально? Возможно, вы превысили max_post_size, или max_upload_filesize. При входе в систему с помощью FileZilla вы копируете файлы как вы, при загрузке с помощью PHP, если вы хотите, чтобы этот файл был от пользователя, который запускает apache (например, www-data), попробуйте поставить chmod 755 для изображений.
или работать suexec и никогда не придется снова изменить разрешения.
Я столкнулся с очень непонятным и раздражающим причиной ошибки 6. После того, как дурачились с некоторыми НФС подключенных томов, загружает начало слабеть. Проблема решена путем перезапуска служб
systemctl restart php-fpm.service
systemctl restart httpd.service
Пожалуйста, убедитесь, что тег форма
иметь этот атрибут:
enctype="от multipart/данные формы"
в
$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';
}
}
На виртуальном хостинге проверить дисковую квоту вашего.
если квота превышает, move_uploaded_file
вернет ошибку.
ЗЫ : я'вэ искал для этого долгое время :)