WebServiceはマルチプラットフォームのアップロードファイルの実現をサポートします。

9666 ワード

ウェブサイトを使ってファイルをアップロードするには、ASP.NETのカテゴリーでは、基本的には2つのカテゴリーが考えられます。一つはHTTP POSTを通じてファイル情報を取得することです。もう一つはWebServiceやWCFなどの技術を通じてサービスを公開します。
以前3 Gカメラのプロジェクトをした時、HTTP POSTを使って写真を獲得したことがあります。簡単な方法です。つまりaspxファイルです。最初はaspで実現しました。aspxを使っている時にはガムシも出ました。クライアント(カメラ)だけがPOSTの要求を理解して、写真をデータにして転送してくれます。この方式も悪くないです。システムに統合する時にはいつも問題が発生します。とにかく複数のクライアントを作るべきだと考えて、第二の方式に変えました。
 
必要なのは、複数のプラットフォーム(PC、Android、iOS)のファイル転送を実現することです。
WCFを使ってくださいと言いましたが、これまで使っていたので、使いやすいですが、他の人はWCFは非・NETプラットフォームとのつながりが難しいと思います。
Androidがwebserviceを呼び出しても二つの方式があるようです。私達が実現したのはksop 2で呼び出すことです。まず私はWEBSERVICEを作成したいです。
ファイルはどんなパラメータで伝達されますか?
  • 単純暴力byte[]は、FileクラスまたはFileStreamクラスを使用して、ファイルをbyte配列に容易に振り込み、直接転送することができる。
  • は簡単ではないですが、暴力的なstringは、ある方法でファイルをstringに変えて転送します。
  • 他の方法は、objectに似ていますか?あるいは他の何か。
  • ここには序文化の知識があります。まだ深く体得していません。自分の見方を話しましょう。
    まず、個人的にはオブジェクトを格納したり、伝送したりできるようにすることができます。これがあれば、インターネットアプリケーションを簡単に実現することができます。そして、KSOAP 2は基本的なデータタイプに対しても序列化されています。私はstringを見ましたが、サポートするかどうかは分かりません。
    本題に戻れば、いっそのこと2つとも来てください。
     
    自分はちょっと疑問があるので、まず第二の方法を実現しました。ある方法でbase 64符号化復号します。この符号化によりBYTEを直接ネットワーク伝送可能なstringにすることができ、server側でデータを受信して復号すると元のbyte[]が得られる。次のweb端末関数を使用します。
    [WebMethod(MessageName = "UploadSmallString")]
            public bool UploadSmallString(string fileName, string serializedData)
            {
                try
                {
                    byte[] receivedBytes = Convert.FromBase64String(serializedData);
                    using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(fileName), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                    {
                        fs.Write(receivedBytes, 0, receivedBytes.Length);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    クライアントはbase 64でコードすればいいです。インターネットでたくさん探してみます。丁寧なゲストはファンクション名のSmallStringを見るかもしれません。そうです。これはファイルがあまり大きくない時に送るのに適しています。大きなファイルを転送しますか?
    ブロックを分けますブロック分け伝送の利点は、断点継続をサポートし、クライアントの実現構想を説明することにある。
    1.ファイルサイズを判断する
    2.ブロック分け伝送に適用されるかどうか
    3.サービスを呼び出して操作する
    そしてサーバー側は、重載しますが、試してみたら成功しませんでした。http://www.cnblogs.com/menglin2010/archive/2012/03/29/2421445.htmlを参照してください。あまりサポートしていないと言いました。改変したいなら、「WebServiceBinding(Conforms To=WsiProfiles.BaicProfile 1_1)」を使って、Noneに変えて重載をサポートしてください。
    /// <summary>
            ///   BASE64            
            /// </summary>
            /// <param name="fileName">   </param>
            /// <param name="serializedData">BASE64  </param>
            /// <param name="blockSerial">        ID</param>
            /// <returns>       ID,     -1</returns>
            [WebMethod(MessageName = "UploadBlobString", Description = "          ,blockserial 0      ,       ")]
            public int UploadBlobString(string fileName, string serializedData, int blockSerial = 0)
            {
                try
                {
                    byte[] receivedBytes = Convert.FromBase64String(serializedData);
                    if (blockSerial == 0)
                    {
                        using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(fileName), FileMode.Create))
                        {
                            fs.Write(receivedBytes, 0, receivedBytes.Length);
                        }
                    }
                    else
                    {
                        using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(fileName), FileMode.Append))
                        {
                            fs.Write(receivedBytes, 0, receivedBytes.Length);
                        }
                    }
                    return blockSerial;
                }
                catch
                {
                    return -1;
                }
            }
    ちょっと考えてみたら、これは前の方法に取って代わることができるようです。NETのデフォルトパラメータの特性で、ブロックSerialを指定してデフォルトは0です。クライアントが中断したら、継続する時はブレークポイントブロックSerialから開始すればいいです。
     
    次に第一の方法を話します。bye[]を使う方法です。
    [WebMethod(MessageName = "UploadSmallByte", Description = "    BYTE    ")]
            public bool UploadSmallByte(string fileName, byte[] fileBytes)
            {
                try
                {
                    using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(fileName), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                    {
                        fs.Write(fileBytes, 0, fileBytes.Length);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    このような方法はあまりテストしたことがないですが、面白いことがあります。ANDROIDコードBASE 64後のstringが直接byteパラメータに伝達されたら、この関数は正常に動作します。アップロードされた写真は正常に表示されます。とても怪しいです。ネットで試してみたいです。
     
    P.S.BASE 64方式のコードはテストを経てANDROIDプラットフォームとPCプラットフォームの下で通過できます。iOSはBASE 64が実現するのを待っています。(内部のBASE 64符号化方法はないようです。)原理的には大丈夫です。ご検討ください。