如何将图像从Android发送到WCF服务器?

时间:2013-10-25 11:29:51

标签: c# android wcf multipartform-data

我致力于将图像从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";
    }

2 个答案:

答案 0 :(得分:0)

我想说使用Base64格式将以base64格式编码的图像作为字符串发送。

答案 1 :(得分:0)

很抱歉回答一个老问题。但我花了5个多小时才弄明白这个问题。所以想分享我找到的解决方案。 我的问题是保存在服务器中的图片已损坏

实际上,WCF没有一种解析多部分表单数据的有效方法。这就是为什么MS的建议是使用原始流将图像传输到wcf服务。

因此,经过几个小时的努力摆脱MultipartEntity(替换为ByteArrayEntity)后,我终于通过使用下面的代码得到了它。希望这应该对某人有所帮助。

的Android

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客户端的其余部分继续。

Wcf接口

<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的第一篇文章,非常感谢你。