How to upload a file using Java HttpClient library working with PHP
Как загрузить файл с помощью Java HttpClient library, работающей с PHP
Я хочу написать Java-приложение, которое будет загружать файл на сервер Apache с помощью PHP. В Java-коде используется Jakarta HttpClient library версии 4.0 beta2:
executing request POST http://localhost:9002/upload.php HTTP/1.1
HTTP / 1.1 200 OK Возможная атака при загрузке файла: filename ". Массив ( )
Итак, запрос прошел успешно, я смог связаться с сервером, однако PHP не заметил файл - метод is_uploaded_file вернулfalse, а $_FILES переменная пуста. Я понятия не имею, почему это могло произойти. Я отследил HTTP-ответ и запрос, и они выглядят нормально: запрос:
POST /upload.php HTTP / 1.1 Длина содержимого: 13091 Тип содержимого: двоичный / октетный поток Хост: localhost: 9002 Подключение: Постоянно Пользовательский агент: Apache-HttpClient/4.0-beta2 (java 1.5) Ожидание: 100-Продолжить
Řŕ..... остальная часть двоичного файла...
и ответ:
HTTP/1.1 100 Продолжить
HTTP/1.1 200 OK Дата: Ср., 01 июля 2009 г. 06:51:57 GMT Сервер: Apache / 2.2.8 (Win32) DAV/2 mod_ssl /2.2.8 OpenSSL /0.9.8g mod_autoindex_color PHP/5.2.5 mod_jk/1.2.26 X-Powered-By: PHP / 5.2.5 Длина содержимого: 51 Время ожидания: timeout = 5, max = 100 Подключение: время ожидания: Keep-Alive Тип содержимого: текст / html
Возможная атака при загрузке файла: filename ".Массив ( )
Я тестировал это как на локальной Windows xp с xampp, так и на удаленном сервере Linux. Я также пытался использовать предыдущую версию HttpClient - версию 3.1 - и результат был еще более неясным, is_uploaded_file возвращенный false, однако $_FILES массив был заполнен правильными данными.
Переведено автоматически
Ответ 1
Хорошо, код Java, который я использовал, был неправильным, вот правильный класс Java:
Правильным способом будет использование метода multipart POST . Смотрите Здесь пример кода для клиента.
Для PHP доступно множество руководств. Это первое, которое я нашел. Я рекомендую вам сначала протестировать PHP-код с помощью html-клиента, а затем попробовать java-клиент.
Ответ 4
Я столкнулся с той же проблемой и обнаружил, что имя файла требуется для httpclient 4.x для работы с серверной частью PHP. Для httpclient 3.x это было не так.
Итак, мое решение - добавить параметр name в конструктор FileBody. ContentBody cbFile = new FileBody(файл, "изображение / jpeg", "ИМЯ_ФАЙЛА");