我使用以下代码从Android应用程序向CGI C ++程序发送二进制数据(在AsyncTask中的doInBackground中调用):
public static HttpResponse makeRequestPost(String uri, MyObject obj) {
try {
HttpPost httpPost = new HttpPost(uri);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(stream);
obj.writeRawObject(dataStream);
byte[] byteArray = stream.toByteArray();
ByteArrayEntity entity = new ByteArrayEntity(byteArray);
entity.setContentType("application/octet-stream");
entity.setChunked(true);
httpPost.setEntity(entity);
return new DefaultHttpClient().execute(httpPost);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "UnsupportedEncodingException. " + e.getMessage());
} catch (ClientProtocolException e) {
Log.e(TAG, "ClientProtocolException. " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException. " + e.getMessage());
}
return null;
}
我使用CURL测试了相同的服务器,并使用以下命令将数据写入文件:
obj.writeRawObject(dataStream);
此外,上面代码中的byteArray和实体变量在调用execute(httpPost)之前都包含正确的数据。
出于某种原因,在服务器端
char* lenstr = getenv("CONTENT_LENGTH");
运行应用程序时,返回NULL。我试图发送的数据是从几个字节到30 kB。无论大小如何,它都不会在服务器端获得它们。应用程序可以与服务器通信但不附加二进制数据。这是我缺少的东西吗?
这样的东西来自CURL:
curl -i -H "Content-Type:application/octet-stream" -X POST --data-binary @file_with_my_obj.bin <url>
欣赏任何想法。
答案 0 :(得分:0)
你能尝试在setContentType中使用binary / octet-stream而不是application / octet-stream吗?