0

我正在将图像从 Android 发送到 WCF 服务器。我尝试在多部分正文中发送 FileBOdy,但这并没有完成工作。最后,我尝试在多部分正文中发送 ByteArrayBody。它确实有效,但我在服务器中得到了损坏的图像。我搜索了很多,但无法为我的问题找到可接受的解决方案。有人能在我的 Android 或 WCF 代码中发现错误吗?

安卓代码

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";
    }
4

2 回答 2

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

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

于 2014-04-29T19:31:04.557 回答
0

我会说使用 Base64 格式以字符串形式发送以 base64 格式编码的图像。

于 2013-10-25T11:44:42.660 回答