2

我有一个 Android 应用程序(API 10),其中一项功能允许用户捕获照片并使用 ksoap 将其发送到 asp.net Web 服务。Android 应用程序运行良好,将包括图像字节数组在内的所有数据发送到数据库。SQL 数据库有一个用于存储字节数组的数据的 Image 字段。这一切都按预期工作。但是,在进行测试以确保没有损坏、正确保存图像等时,我尝试使用 .ashx 页面渲染图像,它只显示“损坏的图像”图标。我确定这是我想念的简单的东西,但是在盯着它看了很长时间之后,它没有任何意义。

这是抓取字节数组的 Android 应用程序片段:

byte[] ba;
String filepath = "/sdcard/";
File imagefile = new File(filepath + "img.jpg");
FileInputStream fis = new FileInputStream(imagefile);
Bitmap bm = BitmapFactory.decodeStream(fis);
Bitmap sbm = Bitmap.createScaledBitmap(bm, 640, 480, false);
if(bm != null)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    sbm.compress(Bitmap.CompressFormat.JPEG, 100, out);
    ba = out.toByteArray();
}

下面是创建 SOAP 并执行它的 Android 应用程序片段:

SoapObject request = new SoapObject(NAMESPACE, SEND_METHOD_NAME);
request.addProperty("pkid", pkid);
request.addProperty("img", ba);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
MarshalBase64 marshal = new MarshalBase64();
marshal.register(envelope);
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(SEND_URL);
try
{
    androidHttpTransport.call(SEND_SOAP_ACTION, envelope);
}
catch(Exception e)
{
    e.printStackTrace();
}

这是接收 SOAP 消息的 ASP.Net Web 服务的片段:

[WebService(Namespace = "http://www.domain.com")]
[System.Web.Services.Protocols.SoapDocumentService(RoutingStyle = System.Web.Services.Protocols.SoapServiceRoutingStyle.RequestElement)]
[System.ComponentModel.ToolboxItem(false)]
public class sendWorkOrderService : System.Web.Services.WebService
{
    public SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["main"].ConnectionString);

    [WebMethod(Description = "This is it", EnableSession = false)]
    public void receive(int pkid, byte[] img)
    {
        if (img.Length > 0)
        {
            cmd = new SqlCommand("update table set photo = @arrayToInsert where pkid = " + pkid, con);
            cmd.Parameters.Add("@arrayToInsert", SqlDbType.Image, 16).Value = img;
        }
        else
        {
            // do nothing
        }
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }
}

这个应用程序已经成功地使用了这个和另一个服务,唯一的问题是将图像文件作为字节数组提交,它起作用,但我无法在测试中渲染图像以确保它发送正常。我敢肯定这是我想念的简单的东西。感谢您的反馈...

4

1 回答 1

2

我让它工作了,Android 代码工作正常,问题出在服务和我的测试网页上。该服务需要将传入的字节数组作为更新语句的 SQL 参数进行处理,如下所示:

cmd.Parameters.Add("@arrayToInsert", SqlDbType.Image, img.Length).Value = img;

其中“img”是来自 Android 的传入字节数组。然后在测试网页中,我像这样渲染图像:

MemoryStream stream = new MemoryStream();
SqlCommand command = new SqlCommand("select photo from table where pkid = @ImageID", con);
command.Parameters.AddWithValue("@ImageID", Request.QueryString["ImageID"]);
byte[] image = (byte[])command.ExecuteScalar();
stream.Write(image, 0, image.Length);
System.Drawing.Image bitmap = new Bitmap(stream);
Response.ContentType = "image/jpeg";
bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
con.Close();
stream.Close();

这就是它所需要的!感谢@andrewr73的建议!

于 2012-04-18T14:53:19.757 回答