Intereting Posts
Какова цель контроллера в шаблоне MVC с использованием PHP? Лучшая практика в отношении одноэлементных классов PHP PhP Mysql как правильно использовать, избегайте ошибок заголовков Codeigniter: сброс значений формы Как получить фактический URL-адрес запроса в Apache / PHP, если он не существует, и пользователь перенаправляется на страницу ошибок 404? Как экспортировать часть таблицы как SQL в Adminer? Zend как использовать компонент кэша Управление «виртуальным веб-браузером» на любом языке Фильтрация контента на основе слов Неустранимая ошибка: «перерыв» не в контексте «loop» или «switch» в Использование разбиения на страницы с строкой запроса для формы поиска, которая имеет метод, установленный для получения в codeigniter PHP Как сохранить данные из массива в mysql с помощью laravel 5 Уведомление в корзине Woocommerce, показывающее несколько раз Замена ] ссылкой на мою wiki PHP Soap Client – отправка неправильных заголовков «soapenv: VersionMismatch»

move_upload_file, возвращает false, но все еще работает и не работает корректно

Я отправляю изображение с Android-приложений на сервер. Проблема заключается в том, что изображение не перемещается к правильному пути, но только в текущем каталоге (только в котором хранится этот php-скрипт). Я тестировал эти коды на локальном сервере и веб-сервере, получая одинаковый результат. Любой может узнать, какие проблемы.

Локальный сервер: XAMPP 1.7.7

Мой скрипт PHP:

<?php $base=$_REQUEST['image']; $Username=$_REQUEST['Username']; $binary=base64_decode($base); header('Content-Type: bitmap; charset=utf-8'); $file = fopen($Username.'.png', 'w'); fwrite($file, $binary); $uploadFilename = '/htdocs/android/ProfileImage/'; $tr =move_uploaded_file($_FILES[$file]['tmp_name'], $uploadFilename); if($tr) echo 'true'; else echo 'false'; echo 'Successfully Uploaded'; ?> 

Отображение вывода и ошибки на локальном сервере

Строгие стандарты: Идентификатор ресурса № 3, используемый как смещение, отбрасывание в целое число (3) в C: \ xampp \ htdocs \ android \ uploadSimage.php в строке 12

Примечание. Неопределенное смещение: 3 в C: \ xampp \ htdocs \ android \ uploadSimage.php в строке 12

falseSuccessfully Uploaded

Отображение вывода и ошибки на веб-сервере

Примечание: Неопределенное смещение: 3 в C: … \ uploadSimage.php в строке 12

falseSuccessfully Uploaded

move_uploaded_file () ожидает, что вторым параметром будет строка, представляющая новый путь и имя файла загрузки. В настоящее время вы проходите только по пути. Я также сомневаюсь, правильный ли путь. Это должен быть полный путь или относительный путь.

Вы также неправильно $_FILES массив $_FILES . Вы загружаете изображение, кодируя его в base64 и передавая его через строку запроса URL? Или вы загружаете его, используя поле для загрузки файлов multipart/form-data ?

Если вы загрузили файл, принадлежащий загружаемому полю, называемому image вы получите доступ к файлу следующим образом:

 $origname = $_FILES['image']['name']; // the name from the client device $temppath = $_FILES['image']['tmp_name']; // the temp location on the PHP server $error = $_FILES['image']['error']; // > 0 if there was an error $size = $_FILES['image']['size']; // size of the file $type = $_FILES['image']['type']; // mime type, cannot be trusted though 

Затем вы переместите его так:

 // Be careful using the original file name. // If the user uploads a file with a .php extension, they may be // able to run PHP code on your server if they can access the upload folder // You should either generate a random file name or remove the extension // IF THE DESTINATION FILE EXISTS, IT WILL BE OVERWRITTEN $newPath = '/home/yoursite/htdocs/uploads/' . $origname; $moved = move_uploaded_file($_FILES['image']['tmp_name'], $newPath); if ($moved) { echo "File was moved successfully."; } else { echo "Failed to move file."; } 

РЕДАКТИРОВАТЬ:
Если вы фактически загружаете изображение, кодируя его в base64 и отправляя его по URL-адресу, вам вообще не требуется move_uploaded_file ; в этом случае вы можете просто написать декодированное содержимое в файл в любом месте. Имейте в виду, что длина URL-адреса может быть ограничена, поэтому отправка изображения в URL-адрес через base64 может быть не очень хорошей идеей.

EDIT 2:
Чтобы прокомментировать вопросы в следующем ответе: Функция php move_uploaded_file () должна использоваться только тогда, когда файл, который вы пытаетесь переместить, был загружен на PHP с использованием загрузки HTTP POST. Он выполняет внутреннюю проверку, чтобы проверить, загружен ли файл, который вы пытаетесь переместить, на PHP. Если это не так, то файл не будет перемещен. Поэтому вы не должны использовать move_uploaded_file() поскольку вы подтвердили, что загружаете изображение через URL-адрес.

Поскольку ваш путь к скрипту PHP – это C:\xampp\htdocs\android , это означает, что корневой путь – C:\ . Корневой сервер отличается от вашего корня веб-корня или корня документа, который по отношению к вашему общедоступному каталогу. Каждый раз, когда вы имеете дело с чтением / записью файлов в PHP, вы используете полный путь к серверу (относительно C:\ или / ).

Учитывая новые факты, попробуйте использовать такой код, чтобы «загрузить» изображение:

 <?php $base = (isset($_REQUEST['image'])) ? $_REQUEST['image'] : ''; $Username = (isset($_REQUEST['Username'])) ? trim($_REQUEST['Username']) : ''; $binary = @base64_decode($base); if (empty($Username)) { die('no username specified'); } if (!$binary) { // data was not in base64 or resulted in an empty string die('invalid image uploaded'); } $basePath = 'C:\\xampp\\htdocs\\android\\ProfileImage\\'; $imagePath = $basePath . $Username . '.png'; $file = @fopen($imagePath, 'w+'); if (!$file) { die('failed to open ' . $imagePath . ' for writing'); } fwrite($file, $binary); fclose($file); echo 'Successfully Uploaded'; 

Обязательно соблюдайте необходимые меры предосторожности, поэтому я не могу загрузить изображение для другого пользователя.