2012-07-22 4 views
3

나는 윈도우 폰 응용 프로그램에서 일하고 있습니다. 이 앱을 사용하면 사용자가 사진을 찍어 내 서버에 업로드 할 수 있습니다. 나는 이것을 성공적으로 구현했다. 그러나 때때로 사진이 제대로 업로드되지 않는 것으로 나타났습니다. 나는 누군가가 앱 업로드를 완료하기 전에 잠자기 상태로있을 때 이런 일이 일어난다 고 생각한다. 또는 연결이 중단됩니다. 나는이 문제를 해결하는 방법을 정말로 모른다. 나는 여기에 나의 코드를 포함시켰다. 누군가가 통찰력을 제공 할 수 있기를 바랍니다.보장 파일 업로드는 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

+0

죄송합니다. 나는 그것을 볼 수 있습니다. 문자열 pictureBytes를 캡처하고 AddPicture()를 호출하는 코드를 게시 할 수 있습니까? – Les

답변

0

당신은 당신의 업로드 방법에 ContentLength을 설정해야합니다. 이렇게하려면 비동기 요청을 만들기 전에 완료된 데이터 버퍼를 계산해야합니다. 그런 다음 필요한 길이 (UTF8 인코딩 후)를 갖게됩니다. 그런 다음 콜백이 발생하면 스트림에 데이터를 제공하십시오.

+0

어떻게이 ContentLength 속성을 설정합니까? HttpWebRequest 객체에는 존재하지 않습니다. – user609886

+0

WebRequest의 멤버입니다. request.ContentType = "..."다음에 설정하십시오. request.ContentLength = {계산 된 길이}; – Les

+0

"Upload()"에서이 길이를 설정해야합니다. 즉, 요청을 보내기 전에 길이를 미리 계산해야합니다. – Les

관련 문제