如何使用POST上传二进制数据
我的代码中有这样的东西:
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块内,但为了便于阅读,我删除了它)
我认为你应该使用类似Apache HttpClient的东西(或者也许是在他们的http-mime模块中,我自己没有使用它)可以做多部分post。 例如,请参阅此问题 。 像JPEG这样的二进制数据不是字符数据,实际上不应该放在String
。
我没试过这个,但也许这会奏效
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);