httpclient multipart post с потоковой передачей - PullRequest
3 голосов
/ 18 ноября 2011

Я ищу простое и понятное решение для многочастной публикации HTTP, которая будет отправлять несколько строк (данных формы) и несколько файлов с поддержкой потоковой передачи. (файлы должны быть потоковыми, чтобы избежать ошибки нехватки памяти) Я хотел бы добиться этого с помощью встроенного «org.apache.httpclient», если это возможно.

Мне удалось создать чистое решение с помощью HttpURLConnection. Несмотря на все мои усилия с этим решением, строки были отправлены с кодировкой 8859-x вместо UTF-8.

РЕДАКТИРОВАТЬ: мой код доступен в MultiPart с HttpURLConnection источник

Я создал выходной поток с этим кодом:

HttpURLConnection connection = setupConnection();
dataOutputStream = new DataOutputStream(connection.getOutputStream());

После этого я просто записал данные с помощью dataOutputStream.writeBytes

Если бы я мог получить выходной поток от httpclient, это было бы здорово, однако, похоже, он работает по-другому.

Любая помощь приветствуется. Спасибо

1 Ответ

6 голосов
/ 18 ноября 2011

Я только что создал для этого простое решение: android_multipart_entity .

Это бесплатно (в том числе для коммерческого использования), однако, если это возможно, сохраните ссылки на меня внутри моегоклассы.

Он предназначен для использования со встроенным Android HttpClient.Пример кода использования:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yourhost.com");
MultipartEntity entity = new MultipartEntity();
entity.addPart(new StringPart("name", "yourname"));
File imageFile = // .. get your image file
entity.addPart(new FilePart("picture", imageFile, null, "image/jpeg"));
httppost.setEntity(entity);
HttpResponse httpResponse = httpclient.execute(httppost);

РЕДАКТИРОВАТЬ:

Я рассмотрел ваш MultiPart с кодом подключения HttpURLC.Вы получаете проблему UTF-8 из-за использования DataOutputStream.API говорит для этого класса:

Обертывает существующий OutputStream и записывает в него big-endian типизированных данных.Обычно этот поток может быть прочитан DataInputStream .

Этот класс просто не соответствует вашим потребностям.Для того, чтобы прочитать данные, у вас должна быть прямая противоположность - DataInputStream на другом конце.

Поэтому я бы посоветовал использовать обычный OutputStream.И написать байты к нему.Что-то вроде этого:

outputStream.write(partSeparator.getBytes());
outputStream.write(("Content-Disposition: form-data; name=\"" + parameter.getKey() + "\"" + lineEnd).getBytes());
outputStream.write(("Content-Type: text/plain; charset=UTF-8" + lineEnd).getBytes());
outputStream.write(("Content-Transfer-Encoding: 8bit" + lineEnd).getBytes());
outputStream.write(lineEnd.getBytes());
outputStream.write(parameter.getValue().getBytes("UTF-8")); // <= this is it!
outputStream.write(lineEnd.getBytes());
outputStream.write(partSeparator.getBytes());
...