4

私がやろうとしているのは、Android から C# である Web サービスに画像を送信することです。Android側では、エラーも警告も表示されませんが、サービスで表示するものは何もありません。実際に画像を取得することはありません。

私はまだこの方法でサービスに特に慣れていないので、どんな助けも大歓迎です!!

私のAndroid AsyncTask は次のようになります。

@Override
        protected String doInBackground(File... file) {

            String imageDescriptionTemp = "Photo Temp Description.";
            String PostRequestUri = "https://demo.relocationmw.com/ws_docmgmt/Service1.svc";
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(PostRequestUri);
            FileBody bin1 = new FileBody(file[0]);
            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            entity.addPart("Image", bin1);
            post.setEntity(entity);
            HttpResponse response;
            try {
                response = client.execute(post);
                resEntity = response.getEntity();
                final String response_string = EntityUtils.toString(resEntity);
                if(resEntity != null){
                Log.i("RESPONSE", response_string); 
                }
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

サーバー上のサービスファイルを呼び出し、画像とすぐに説明とすべてを送信するだけです。

これが私のC#サービスコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Xml;


// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
public class Service1 : IService1
{
    #region vars
    XmlDocument doc = new XmlDocument();// Create the XML Declaration, and append it to XML document
    XmlElement root;

    #endregion

    public Stream GetImage(string path)
    {
        FileStream stream = File.OpenRead(@System.Web.Hosting.HostingEnvironment.MapPath("~/attachments/test/") + "SrvTest.jpg");
        WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
        return stream as Stream;
    }

    public XmlDocument UpImage(string path, Stream filecontents)
    {

        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);

        doc.PreserveWhitespace = true;

        doc.AppendChild(dec);// Create the root element

        root = doc.CreateElement("UpImage");

        doc.AppendChild(root);


        XmlElement xml_item;
        xml_item = doc.CreateElement("Response");

        Image img = System.Drawing.Image.FromStream(filecontents);
        img.Save(System.Web.Hosting.HostingEnvironment.MapPath("~/attachments/test/") + "SrvTest.jpg", ImageFormat.Jpeg);

        XmlElement item;
        item = doc.CreateElement("Success");
        item.InnerText = "Success";
        xml_item.AppendChild(item);

        return doc;

    }
}

これにより、ファイルが受け入れられ、ログに記録するために SUCCESS を含む XML が返されます。繰り返しますが、どんな助けも大歓迎です!

4

2 に答える 2

1

アプリが IE に読み込まれる一般的な html フォームであると仮定して、そのフォームが送信するものを正確に送信します。そうすれば、サーバー コンポーネントを簡単なテスト フォームでテストできます。

まず、画像をサービスに送信するプレーンな html フォームを作成します。type 属性が「file」に設定された input 要素を使用し、id だけでなく要素に名前を付けてください...

HTML フォームが正常に投稿されたことを確認できたら、Android クライアント コードに問題があることがわかります。

問題が Android コードにある場合は、本文の内容を確認してください。null でないことなどを確認し、Content-Type ヘッダーと Content-Disposition ヘッダーが正しく設定されているかどうかを確認します。

上記のすべてのテストに合格したら、投稿の境界線を確認します。数年前、私はこの問題で 2 回脱線しそうになりました。(見えない文字はカウントされます。)

参考になる良い例を次に示します:マルチパートでサーバーにイメージをアップロードし、Android で JSON データをアップロードする

バックエンド (Java) は異なりますが、http ルールは同じです。

-ブランドン

于 2013-04-22T02:55:48.290 に答える