我致力于将图像从Android发送到WCF服务器。我尝试在多部分机构中发送FileBOdy,但这并没有完成工作。最后,我尝试在多部分体中发送ByteArrayBody。它确实有效,但我在服务器中出现了损坏的图像。我google了很多,但无法得到一个可接受的解决方案来解决我的问题。任何人都可以在我的Android或WCF代码中发现错误吗?
Android代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 75, bos);
byte[] data = bos.toByteArray();
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
String URL1 = "http://rohit-pc:8078/service1.svc/UploadImage";
HttpPost httpPost = new HttpPost(URL1);
ContentBody bin = null;
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
ByteArrayBody bab = new ByteArrayBody(data, "forest.jpg");
reqEntity.addPart("image", bab);
reqEntity.addPart("photoCaption", new StringBody("sfsdfsdf"));
httpPost.setEntity(reqEntity);
HttpResponse response = httpClient.execute(httpPost);
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
String sResponse;
s = new StringBuilder();
while ((sResponse = reader.readLine()) != null) {
s = s.append(sResponse);
}
System.out.println("Response: " + s);
} catch (Exception e) {
Log.e(e.getClass().getName(), e.getMessage());
}
WCF代码
public string GetStream(Stream str,string filename) {
Guid guid = Guid.NewGuid();
string Path = System.Web.Hosting.HostingEnvironment.MapPath("~/Images");
FileStream file = new FileStream(Path + "/" +filename, FileMode.Create);
byte[] bytearray = new byte[100000000];
int bytesRead, totalBytesRead = 0;
do {
bytesRead = str.Read(bytearray, 0, bytearray.Length);
totalBytesRead += bytesRead;
} while (bytesRead > 0);
file.Write(bytearray, 0, bytearray.Length);
file.Close();
file.Dispose();
return "Success";
}
答案 0 :(得分:0)
我想说使用Base64格式将以base64格式编码的图像作为字符串发送。
答案 1 :(得分:0)
很抱歉回答一个老问题。但我花了5个多小时才弄明白这个问题。所以想分享我找到的解决方案。 我的问题是保存在服务器中的图片已损坏。
实际上,WCF没有一种解析多部分表单数据的有效方法。这就是为什么MS的建议是使用原始流将图像传输到wcf服务。
因此,经过几个小时的努力摆脱MultipartEntity(替换为ByteArrayEntity)后,我终于通过使用下面的代码得到了它。希望这应该对某人有所帮助。
Bitmap bm = BitmapFactory.decodeFile(params[0]);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bm.compress(CompressFormat.JPEG, 75, bos);
byte[] data = bos.toByteArray();
// the below is the important one, notice no multipart here just the raw image data
request.setEntity(new ByteArrayEntity(data));
然后实际的http客户端的其余部分继续。
<OperationContract()>
<WebInvoke(Method:="POST",
ResponseFormat:=WebMessageFormat.Json,
BodyStyle:=WebMessageBodyStyle.Bare,
UriTemplate:="/UploadPhoto?UsedCarID={UsedCarID}&FileName={FileName}")>
Sub UploadPhoto(UsedCarID As Integer, FileName As String, FileContents As Stream)
这是我在Stack Overflow的第一篇文章,非常感谢你。