2010-03-30 3 views
6

Мне нужно, чтобы загрузить изображение на удаленный сервер PHP, который ожидает следующие параметры в HttpPost:Загрузка изображений на PHP сервер с Android

*$_POST['title']* 
*$_POST['caption']* 
*$_FILES['fileatt']* 

Большинство поиска в Интернете предлагается либо:

Загрузите следующие классы и пытается MultiPartEntity отправить запрос:

apache-mime4j-0.5.jar 
httpclient-4.0-beta2.jar 
httpcore-4.0-beta3.jar 
httpmime-4.0-beta2.jar 

ИЛИ

Используйте URL-соединение и обрабатывайте данные мультиплексора.

Кстати, я увлекаюсь использованием классов HttpClient, а не классов java.net (или это android.net). В конце концов, я загрузил классы Multipart из исходного кода Android и использовал их в своем проекте.

Хотя это может быть сделано любым из вышеперечисленных методов, я хотел бы убедиться, что это единственный способ достичь указанной цели. Я просмотрел документацию и нашел класс FileEntity, но я не мог заставить его работать.

Каков правильный способ сделать это в приложении для Android?

Спасибо.

+0

Для упрощения реализации см. Мой [пост] (http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/). – Vikas

ответ

5

Источник Android, похоже, снабжен встроенной вспомогательной библиотекой. See this post. С быстрым взглядом, это лучше документировано, чем много публичных API (кашель кашель, SoundPool, кашель кашель), поэтому это должно быть довольно хорошее место для начала или, возможно, просто использовать решение для вставки.

+0

Да, я тоже видел эту тему и мне удалось загрузить пакет «multipart» и использовать его, просто изменив имена пакетов. Спасибо за ваш ответ. – Samuh

+1

Вы также можете проверить официальный проект Apache HTTPMime: http://hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html Он основан на Mime4j, и я не использовал его лично, но, похоже, он стремиться делать multipart на HTTPClient 4; вероятно, он будет работать с Android HTTPClient, но я не могу сказать точно. –

3

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

Я строю List<NameValuePair> моих ключей и значений что-то вроде этого:

List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
    params.add(new BasicNameValuePair(key1, value1)); 
    params.add(new BasicNameValuePair(key2, value2)); 

, а затем я передать его на мой HTTP вспомогательный класс, который устанавливает HttpEntity свойство моего запроса HttpPost. Вот этот метод прямо из моего вспомогательного класса:

public static HttpResponse Post(String url, List<NameValuePair> params, Context context) 
{ 
    HttpResponse response = null; 
    try 
    { 
     HttpPost request = new HttpPost(); 
     request.setURI(new URI(url)); 
     if(params != null) 
      request.setEntity(new UrlEncodedFormEntity(params)); 
     HttpClient client = ((ApplicationEx)context.getApplicationContext()).getHttpClient(); 
     response = client.execute(request); 
    } 
    catch(Exception ex) 
    { 
     // log, etc 
    } 
    return response; 
} 
+0

Какой тип объекта сущности вы создаете для инкапсуляции файлового объекта? – Samuh

+0

Ну ... если бы я владел обеими сторонами контракта, я бы не использовал массив $ _FILES ... Я бы отправил регулярную пару ключ/значение в качестве постпараметра, где значение представляет собой поток байтов. Если у меня есть только клиент, и сервер строго требует материал $ _FILES, я бы сделал тестовую html-страницу с простой формой, которая делает именно это (загрузка файла), проследит ее с помощью скрипача и создаст почтовую полезную нагрузку вручную, чтобы отразить заголовки и полезная нагрузка. Браузер создает «граничную» строку, сообщает серверу, какая граница находится через заголовок, а затем включает в себя байтовый поток на этой границе. Вы можете сделать то же самое. – Rich

+0

Это именно то, что я имел в виду, когда я сказал: Используйте URL-соединение и обрабатывайте данные мультиплексора. Что я действительно хочу - это класс, такой как MultipartEntity, который обрабатывает все это для меня. К сожалению, этот класс не был импортирован Android. Однако документация завершает класс FileEntity, и мне было интересно, как его использовать. – Samuh

4

Возможно, это помогает post в официальной группе Android. Парень использует mime4j.

Еще один полезный ресурс может быть this example в книге Android Pro.

Смежные вопросы