我々は、ファイルのバイト配列を読み取り、chunckバイト配列をbase64文字列に変換するには?
public static string ZipToBase64()
{
FileUpload fileCONTENT = FindControl("FileUploadControl") as FileUpload;
byte[] byteArr = fileCONTENT.FileBytes;
return Convert.ToBase64String(byteArr);
}
string attachmentBytes = ZipToBase64();
string json1 = "{ \"fileName\": \"Ch01.pdf\", \"data\": " + "\"" + attachmentBytes + "\"}";
を次のように我々はそれがメモリ不足の例外投げされ、base64文字列に1ギガバイト点で最大サイズの大きいファイルを変換しようとするbase64文字列に変換されます。私たちはこのjsonを安らかなwcfサービスに送ります。以下は、RESTful WCFサービスにおける私のメソッドです。
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public void UploadFile1(Stream input)
{
string UserName = HttpContext.Current.Request.Headers["UserName"];
string Password = Sql.ToString(HttpContext.Current.Request.Headers["Password"]);
string sDevideID = Sql.ToString(HttpContext.Current.Request.Headers["DeviceID"]);
string Version = string.Empty;
if (validateUser(UserName, Password, Version, sDevideID) == Guid.Empty)
{
SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "Invalid username or password for " + UserName);
throw (new Exception("Invalid username or password for " + UserName));
}
string sRequest = String.Empty;
using (StreamReader stmRequest = new StreamReader(input, System.Text.Encoding.UTF8))
{
sRequest = stmRequest.ReadToEnd();
}
// http://weblogs.asp.net/hajan/archive/2010/07/23/javascriptserializer-dictionary-to-json-serialization-and-deserialization.aspx
JavaScriptSerializer json = new JavaScriptSerializer();
// 12/12/2014 Paul. No reason to limit the Json result.
json.MaxJsonLength = int.MaxValue;
Dictionary<string, string> dict = json.Deserialize<Dictionary<string, string>>(sRequest);
string base64String = dict["data"];
string fileName = dict["fileName"];
byte[] fileBytes = Convert.FromBase64String(base64String);
Stream stream = new MemoryStream(fileBytes);
//FileStream fs1 = stream as FileStream;
string networkPath = WebConfigurationManager.AppSettings["NetWorkPath"];
File.WriteAllBytes(networkPath + "/" + fileName, fileBytes); // Requires System.IO
}
本当にあなたがストリーミングされた方法で何かを渡すという意味ではありません、あなたのWCFサービスにbase64文字列
1GBのbase64でエンコードされた文字列をjsonとして送信するのは良い考えではありません。 – Evk
@Evkコメントありがとうございました。私たちはアンドロイドモバイルアプリケーションとウェブアプリケーションを使ってファイルをアップロードしています。ファイルシステム上のリモートサーバーにファイルをアップロードしています。なので、ファイルをアップロードするためにRESTFul wcfサービスを書いたのですが –
しかし、私の場合、ファイルが大きくて(10MB以上)、jsonで直列化されたものを渡すべきではありません。あなたはストリーミング方式でリクエストボディにそれらを渡す必要があります。これはRESTful wcfサービスにも当てはまります。私はチャンクでbyte []チャンクをbase64に変換する方法を示していたかもしれませんが、それはあなたには役に立たないでしょう。 – Evk