Этот метод не оптимизирован для Android и, вероятно, будет работать плохо.Соглашение заключается в использовании AndroidHttpClient :
подкласса Apache DefaultHttpClient, который настроен с разумными настройками по умолчанию и зарегистрированными схемами для Android, а также позволяет пользователю добавлять классы HttpRequestInterceptor.
Если вы действительно хотите использовать приведенный выше код Sun, будьте осторожны, так как вы, вероятно, превысите бюджет кучи виртуальной машины, когда размер файла превысит объем кучи, доступный для приложения.
Было бы целесообразно сначала проверить, осталось ли достаточно кучи, используя ActivityManager .См. Также подробный ответ на этот вопрос .
Редактировать:
Я нашел пример отправкиInputStream через POST.Здесь файл читается из ресурса (res/data.xml
), но вы можете заменить InputStream
на FileInputStream
из своего фрагмента.Преобразование InputStream
в байтовый массив, по сути, аналогично вашему коду: считайте весь файл в память и вставьте его в запрос.Это печально известная причина OutOfMemoryError
с, поэтому позаботьтесь о том, чтобы вы не читали файлы слишком большого размера (я бы рекомендовал менее 1 МБ).
public void executeMultipartPost() throws Exception {
try {
InputStream is = this.getAssets().open("data.xml");
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("http://w3mentor.com/Upload.aspx");
byte[] data = IOUtils.toByteArray(is);
InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data),"uploadedFile");
StringBody sb1 = new StringBody("someTextGoesHere");
StringBody sb2 = new StringBody("someTextGoesHere too");
MultipartEntity multipartContent = new MultipartEntity();
multipartContent.addPart("uploadedFile", isb);
multipartContent.addPart("one", sb1);
multipartContent.addPart("two", sb2);
postRequest.setEntity(multipartContent);
HttpResponse res = httpClient.execute(postRequest);
res.getEntity().getContent().close();
} catch (Throwable e) {
// handle exception here
}
}