Как загрузить двоичные данные, используя POST - PullRequest
1 голос
/ 20 февраля 2011

У меня есть что-то вроде этого в моем коде:

String boundary = "thisIsMyBoundaryString";
StringBuilder body = new StringBuilder();  
...  
byte[] data = bos.toByteArray();  
body.append(new String(data));  
body.append("\r\n--" + boundary + "--\r\n");  
String entity = body.toString();  

Я строю запрос POST и мне нужно вставить некоторые двоичные данные (сжатый растровый рисунок JPEG).

После добавления byteArray, Я хочу добавить newLine и граничную строку,
, но StringBuilder поврежден - кажется, что байты от добавленной границы
смещаются с этой точки на
, и они больше не интерпретируются как моя исходная строкано как некоторые случайные символы.

Это то, что здесь происходит?

Как я могу решить эту проблему?Может быть, я должен добавить байт заполнения к byteArray перед добавлением границы?

Как правильно добавить двоичные данные в запрос POST?
Обратите внимание, что при использовании Base64 кодировка здесь не вариант



[править]
Решение заключалось в том, чтобы использовать MultipartEntity для выполнения таких запросов
и забыть о добавлении границ вручную.

Вот соответствующий фрагмент кода:

FileBody bin = new FileBody(new File(Environment.getExternalStorageDirectory() + "/" + FILE_NAME));
MultipartEntity entity = new MultipartEntity();
entity.addPart("message", new StringBody("A message that goes with request"));
entity.addPart("file", bin);

(третья строка должна быть внутри блока try / catch, но я удалил ее для удобства чтения)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2011

Я думаю, что вы должны использовать что-то вроде Apache HttpClient (или, может быть, это в их модуле http-mime, я сам его не использовал), которое может делать многочастные посты. См. этот вопрос , например. Двоичные данные, такие как JPEG, не являются символьными данными и не должны быть помещены в String.

0 голосов
/ 20 февраля 2011

Я не пробовал это, но, возможно, это будет работать

byte[] data = bos.toByArray();
byte[] boundary = "\r\n--BOUNDARY--\r\n".getBytes();
byte[] fullData = new byte[data.length + boundary.length];
System.arraycopy(data, 0, fullData, 0, data.length);
System.arraycopy(boundary, 0, fullData, data.length, boundary.length);
String entity = new String(fullData); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...