Android Multipart Upload
Как часть моего приложения для 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. Я связан с файлами httpclient и httpmime JAR, но не с кубиками. Я слышал, что структура пакета резко изменилась между 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 очень важен. Благодаря блог Radomir на этом.
Ответы
Ответ 1
попробуйте следующее:
HttpClient httpClient = new DefaultHttpClient() ;
HttpPost httpPost = new HttpPost("http://example.com");
MultipartEntity entity = new MultipartEntity();
entity.addPart("file", new FileBody(file));
httpPost.setEntity(entity );
HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (ClientProtocolException e) {
Log.e("ClientProtocolException : "+e, e.getMessage());
} catch (IOException e) {
Log.e("IOException : "+e, e.getMessage());
}
Ответ 2
Возможно, вы можете сделать следующий шаг для импорта библиотеки на ваш Android.
библиотека требований - apache-mime4j-0.6.jar - httpmime-4.0.1.jar
- Щелкните правой кнопкой мыши свой проект и выберите свойства
- выберите путь сборки java
- выберите вкладку "Заказ и экспорт"
- Применить его
- Полностью удалите файл apk с удалением adb из-за существующего apk не для новой библиотеки.
- снова установите ваш apk
- запустите его
Спасибо,
Jenz
Ответ 3
У меня такая же проблема. Я пытаюсь загрузить изображение через MultiPart Entity, и он видит, что несколько обновлений на HttpClient/MIME взламывают все. Я пытаюсь использовать следующий код, падая с ошибкой " NoClassDefFoundError":
public static void executeMultipartPost(File image, ArrayList<Cookie> cookies, String myUrlToPost) {
try {
// my post instance
HttpPost httppost = new HttpPost(myUrlToPost);
// setting cookies for the connection session
if (cookies != null && cookies.size() > 0) {
String cookieString = "";
for (int i=0; i<cookies.size(); ++i) {
cookieString += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";";
}
cookieString += "domain=" + BaseUrl + "; " + "path=/";
httppost.addHeader("Cookie", cookieString);
}
// creating the http client
HttpClient httpclient = new DefaultHttpClient();
// creating the multientity part [ERROR OCCURS IN THIS BELLOW LINE]
MultipartEntity multipartEntity = new MultipartEntity();
multipartEntity.addPart("photoupload", new FileBody(image));
httppost.setEntity(multipartEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
} catch (Exception e) {}
}
Этот метод полностью компилируется и использует httpclient-4.0.1.jar и httpmime -4.2.jar, но опять же, я помню, что он провалился в комментариях для меня.