2012-07-22 34 views
3

我正在使用Windows Phone應用程序。這個應用程序將讓用戶拍照並將其上傳到我的服務器。我已經成功實施了這個。不過,我注意到有時圖片無法正確上傳。我懷疑這發生在有人在完成上傳之前讓應用程序進入睡眠狀態。或者連接中斷。我真的不知道如何解決這個問題。我在這裏包含了我的代碼。我希望有人能提供一些見解。確保將文件從Windows Phone上傳到ASP.NET MVC 3

Client Side - Windows Phone App - Picture.cs 
-------------------------------------------- 
public event EventHandler Upload_Succeeded; 
public event EventHandler Upload_Failed; 
public void Upload() 
{ 
    try { 
    WebRequest request = HttpWebRequest.Create(GetBackendPictureUploadUrl()); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.BeginGetRequestStream(new AsyncCallback(UploadBeginGetRequestStreamCallBack), request); 
    } catch (Exception ex) 
    { 
    Upload_Failed(this, EventArgs.Empty); 
    } 
} 

private void UploadBeginGetRequestStreamCallBack(IAsyncResult ar) 
{ 
    try { 
    StringBuilder sb = new StringBuilder(); 
    this.ImageBytes.ToList<byte>().ForEach(x => sb.AppendFormat("{0}.", Convert.ToUInt32(x))); 

    Dictionary<string, string> parameters = new Dictionary<string, string>(); 
    parameters.Add("username", GetUsername()); 
    parameters.Add("pictureByts", sb.ToString()); 

    string data = string.Empty; 
    foreach (string key in parameters.Keys) 
    { 
     data += key; 
     data += "="; 
     data += parameters[key]; 
     data += "&"; 
    } 
    data = data.Substring(0, data.Length - 1); 

    HttpWebRequest webRequest = (HttpWebRequest)(ar.AsyncState); 
    using (Stream postStream = webRequest.EndGetRequestStream(ar)) 
    { 
     byte[] byteArray = Encoding.UTF8.GetBytes(data); 
     postStream.Write(byteArray, 0, byteArray.Length); 
     postStream.Close(); 
    } 
    webRequest.BeginGetResponse(new AsyncCallback(Upload_Completed), webRequest); 
    } catch (Exception ex) 
    { 
    Upload_Failed(this, EventArgs.Empty); 
    } 
} 

private void Upload_Completed(IAsyncResult result) 
{ 
    Upload_Succeeded(this, EventArgs.Empty); 
} 

Server Size - ASP.NET MVC - MyController.cs 
------------------------------------------- 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddPicture(string username, string pictureBytes) 
{ 
    string path = ConfigurationManager.AppSettings["pictureDirectory"] + "/" + username + "/"; 
    if (Directory.Exists(path) == false) 
    Directory.CreateDirectory(path); 
    string filePath = path + "/" + Guid.NewGuid().ToString() + ".png"; 

    // Save the picture to the file system 
    string[] bytesToConvert = pictureBytes.Split('.'); 
    List<byte> fileBytes = new List<byte>(); 
    bytesToConvert.ToList<string>().Where(x => !string.IsNullOrEmpty(x)).ToList<string>().ForEach(x => fileBytes.Add(Convert.ToByte(x))); 

    using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) 
    { 
    byte[] bytes = fileBytes.ToArray(); 
    fileStream.Write(bytes, 0, bytes.Length); 
    fileStream.Close(); 
    } 
} 

我很困惑。這段代碼在我看來是正確的。但我注意到文件正在我的服務器上寫入。有時他們只是灰色的圖像。有時看起來圖像的一部分是被寫入的,但不是全部。我究竟做錯了什麼?如何確保文件完全上傳/正確書寫?必須有某種方式來做到這一點。顯然,Facebook等正在這樣做。我究竟做錯了什麼?

+0

你有服務器端的代碼嗎? – Les 2012-07-26 16:22:46

+0

對不起,我看到了。你可以發佈代碼捕獲字符串pictureBytes並調用AddPicture()嗎? – Les 2012-07-26 16:32:01

回答

0

您需要在Upload方法中設置ContentLength。要做到這一點,您應該在發出異步請求之前計算完成的數據緩衝區。然後你將有你需要的長度(在UTF8編碼之後)。然後在發生回調時將數據提供給流。

+0

如何設置ContentLength屬性?它不存在於HttpWebRequest對象上。 – user609886 2012-07-25 00:13:13

+0

它是WebRequest的成員。將它設置爲request.ContentType =「...」; request.ContentLength = {計算長度}; – Les 2012-07-26 16:21:02

+0

您需要在「Upload()」中設置此長度,這意味着您需要在發送請求之前預先計算長度。 – Les 2012-07-26 16:22:19