Я использую следующий код, и он успешно загружает файлы на моем локальном компьютере. Он показывает «Успешно загружен» на моем локальном компьютере.
// Upload file $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" ); if( $moved ) { echo "Successfully uploaded"; } else { echo "Not uploaded"; }
Но когда я использовал этот код на своем онлайн-сервере, он не загружает файл и не показывает сообщение «Не загружено».
Как я могу узнать, в чем проблема, и как я могу получить актуальную проблему для пользователя?
Убедитесь, что веб-сервер имеет разрешения на запись в каталог «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()
вернет:
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
ps aux | grep httpd
. Первый столбец – это имя пользователя.
Проверка разрешения на чтение в временном каталоге: вы можете найти путь к вашему временному echo sys_get_tmp_dir();
вызвав 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
возврата move_uploaded_file
.
PS: Я искал это в течение долгого времени 🙂