Загрузить изображение в пользовательском объекте, используя данные формы Multipart в Android
Мне нужно создать загруженную структуру данных как: { "authentication_token":"some_token", "user": { "fname": "fname", "lname": "lname", "avatar": "image-file" "location": "location" } }
"Аватар" на самом деле представляет собой файл изображения (изображение профиля пользователя).
Я попытался создать структуру, используя класс MultipartEntity Apache, добавив объекты FileBody & StringBody. Для пары ключ-значение я использовал NameValuePair. Но я не могу добавить объект User отдельно. Я не знаю как
Я искал ответы в следующих ссылках: MultiPartEntity вместе с обычным текстом в Android Android Multipart Upload Как отправить несколько изображений на сервер, используя MultipartEntity из Android http://www.coderzheaven.com/2011/08/16/how-to-upload -Несколько-файлы-в-одном-запроса по-с-другими-строковых параметров-в-андроида /
1 ответ
После стольких исследований я наконец нашел рабочее решение, не знаю, является ли оно лучшим. Мне пришлось использовать Apache MultipartEntity и его вспомогательные классы.
Вот код:
ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();
BasicNameValuePair bn;
bn = new BasicNameValuePair("authentication_token", app.getSystemValue("authentication_token"));
nameValuePairs.add(bn);
bn = new BasicNameValuePair("fname", user.getFname());
nameValuePairs.add(bn);
bn = new BasicNameValuePair("lname", user.getLname());
nameValuePairs.add(bn);
bn = new BasicNameValuePair("location", user.getLocation());
nameValuePairs.add(bn);
bn = new BasicNameValuePair("avatar", user.getAvatar());
nameValuePairs.add(bn);
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter("Connection", "Keep-Alive");
client.getParams().setParameter("Content-Type", "multipart/form-data;");
client.getParams().setParameter("http.socket.timeout", Integer.valueOf(TIMEOUT_WAIT_TO_CONNECT));
client.getParams().setParameter("http.connection.timeout", Integer.valueOf(TIMEOUT_WAIT_FOR_DATA));
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
int i=0;
for (BasicNameValuePair nameValuePair : nameValuePairs) {
if (nameValuePair.getName().equalsIgnoreCase("avatar")) {
File imgFile = new File(nameValuePair.getValue());
FileBody fileBody = new FileBody(imgFile, "profile.jpeg", "image/jpeg", "UTF-8");
multipartEntity.addPart("user[avatar]", fileBody);
}
else {
if (nameValuePair.getValue()!=null) {
if (i==0) {
multipartEntity.addPart(nameValuePair.getName(), new StringBody(nameValuePair.getValue()));
}
else {
multipartEntity.addPart("user[" + nameValuePair.getName() + "]", new StringBody(nameValuePair.getValue()));
}
}
}
i++;
}
HttpPost post = new HttpPost(serviceUri);
post.setEntity(multipartEntity);
HttpResponse response = client.execute(post);
Я надеюсь, что это помогает кому-то нуждающемуся.