2

機能の1つとして、ユーザーが写真をキャプチャし、ksoapを使用してasp.net Webサービスに送信できるAndroidアプリケーション(API 10)があります。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 コードは正常に動作し、問題はサービスとテスト Web ページにありました。サービスは、次のように、更新ステートメントの SQL パラメーターとして着信バイト配列を処理する必要がありました。

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

ここで、「img」は Android からの受信バイト配列です。次に、テスト Web ページで、次のように画像をレンダリングしました。

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 に答える