Как часть моего приложения для Android, я хотел бы загрузить растровые изображения для удаленного хранения. У меня простое взаимодействие HTTP GET и POST, которое работает отлично, но документация о том, как сделать составной POST, кажется такой же редкой, как единороги.
Кроме того, я хотел бы передавать изображение непосредственно из памяти, а не работать с файлом. В приведенном ниже примере кода я получаю байтовый массив из файла для последующего использования с HttpClient и MultipartEntity.
File input = new File("climb.jpg");
byte[] data = new byte[(int)input.length()];
FileInputStream fis = new FileInputStream(input);
fis.read(data);
ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(), data);
Мне все это кажется достаточно ясным, за исключением того, что я не могу на всю жизнь выяснить, где взять этот ByteArrayPartSource. Я связался с файлами JAR httpclient и httpmime, но не играл в кости. Я слышал, что структура пакета резко изменилась между HttpClient 3.x и 4.x.
Кто-нибудь использует этот ByteArrayPartSource в Android, и как они его импортировали?
Покопавшись в документации и обыскивая Интернет, я нашел что-то, что соответствовало моим потребностям. Чтобы сделать многокомпонентный запрос, такой как форма POST, следующий код помог мне:
File input = new File("climb.jpg");
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://localhost:3000/routes");
MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
String line;
multi.addPart("name", new StringBody("test"));
multi.addPart("grade", new StringBody("test"));
multi.addPart("quality", new StringBody("test"));
multi.addPart("latitude", new StringBody("40.74"));
multi.addPart("longitude", new StringBody("40.74"));
multi.addPart("photo", new FileBody(input));
post.setEntity(multi);
HttpResponse resp = client.execute(post);
Очень важен бит HTTPMultipartMode.BROWSER_COMPATIBLE. Спасибо Блогу Радомира за это.