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端末関数を使用します。
ブロックを分けますブロック分け伝送の利点は、断点継続をサポートし、クライアントの実現構想を説明することにある。
1.ファイルサイズを判断する
2.ブロック分け伝送に適用されるかどうか
3.サービスを呼び出して操作する
そしてサーバー側は、重載しますが、試してみたら成功しませんでした。http://www.cnblogs.com/menglin2010/archive/2012/03/29/2421445.htmlを参照してください。あまりサポートしていないと言いました。改変したいなら、「WebServiceBinding(Conforms To=WsiProfiles.BaicProfile 1_1)」を使って、Noneに変えて重載をサポートしてください。
次に第一の方法を話します。bye[]を使う方法です。
P.S.BASE 64方式のコードはテストを経てANDROIDプラットフォームとPCプラットフォームの下で通過できます。iOSはBASE 64が実現するのを待っています。(内部のBASE 64符号化方法はないようです。)原理的には大丈夫です。ご検討ください。
以前3 Gカメラのプロジェクトをした時、HTTP POSTを使って写真を獲得したことがあります。簡単な方法です。つまりaspxファイルです。最初はaspで実現しました。aspxを使っている時にはガムシも出ました。クライアント(カメラ)だけがPOSTの要求を理解して、写真をデータにして転送してくれます。この方式も悪くないです。システムに統合する時にはいつも問題が発生します。とにかく複数のクライアントを作るべきだと考えて、第二の方式に変えました。
必要なのは、複数のプラットフォーム(PC、Android、iOS)のファイル転送を実現することです。
WCFを使ってくださいと言いましたが、これまで使っていたので、使いやすいですが、他の人はWCFは非・NETプラットフォームとのつながりが難しいと思います。
Androidがwebserviceを呼び出しても二つの方式があるようです。私達が実現したのはksop 2で呼び出すことです。まず私はWEBSERVICEを作成したいです。
ファイルはどんなパラメータで伝達されますか?
まず、個人的にはオブジェクトを格納したり、伝送したりできるようにすることができます。これがあれば、インターネットアプリケーションを簡単に実現することができます。そして、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符号化方法はないようです。)原理的には大丈夫です。ご検討ください。