如何使用POST上传二进制数据

时间:2011-02-20 04:41:19

标签: java android post upload binary-data

我的代码中有这样的内容:

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 :(得分:0)

我没试过这个,但也许这会有用

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); 

答案 1 :(得分:0)

我认为你应该使用Apache HttpClient(或者可能是他们的http-mime模块,我自己没有使用过它)可以做多部分帖子。例如,请参阅this question。像JPEG这样的二进制数据不是字符数据,实际上不应该放在String