2012-08-10 38 views
0

任何人都可以幫助我遇到一個小問題,我有WCF Rest Based Service,它具有可以接受流的功能,這將用於上映圖像/音頻/視頻到服務器,然後將它們存儲在服務器的某個地方。通過WCF上傳文件流,圖像不可見

使用和圖像進行測試,它似乎工作,我選擇客戶端中的圖像,並在幾秒鐘後圖像出現在預期位置的服務器上,但是當我嘗試打開圖像在Windows圖片查看器(或任何圖像查看器),我得到「無法預覽」,並沒有圖像查看。

我假設這是因爲我不是從流中正確再次重新創建文件。

這是在WCF REST服務

public void PutFileInFolder(int eid, Stream fileContents) 
    { 
     try 
     { 

      byte[] buffer = new byte[32768]; 
      MemoryStream ms = new MemoryStream(); 
      int bytesRead = 0; 
      int totalBytesRead = 0; 

      do 
      { 
       bytesRead = fileContents.Read(buffer, 0, buffer.Length); 
       totalBytesRead += bytesRead; 

       ms.Write(buffer, 0, bytesRead); 
      } while (bytesRead > 0); 


      //now have file in memorystream 


      //save the file to the users folder 
      FileStream file = new FileStream(@"C:\bd_sites\ttgme\wwwroot\Evidence\{" + ed.LearnerID + @"}\" + ed.EvidenceFileName, FileMode.Create, System.IO.FileAccess.Write); 
      byte[] bytes = new byte[ms.Length]; 
      ms.Read(bytes, 0, (int)ms.Length); 
      file.Write(bytes, 0, bytes.Length); 
      file.Close(); 
      ms.Close(); 

     } 
     catch (Exception ex) 
     { 
      return; 
     } 
    } 

方法這是用於發送文件/圖像

private void PostFile(EvidenceObject eo) 
    { 
     try 
     { 
      // Create the REST request. 
      string url = ConfigurationManager.AppSettings["serviceUrl"]; 
      string requestUrl = string.Format("{0}/PutFileInFolder/{0}", 1001); 

      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl); 
      request.Method = "POST"; 
      request.ContentType = "text/plain"; 

      byte[] fileToSend = File.ReadAllBytes(txtFileName.Text); 
      request.ContentLength = fileToSend.Length; 

      using (Stream requestStream = request.GetRequestStream()) 
      { 
       // Send the file as body request. 
       requestStream.Write(fileToSend, 0, fileToSend.Length); 
       requestStream.Close(); 
      } 

      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
       Console.WriteLine("HTTP/{0} {1} {2}", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription); 

      MessageBox.Show("File sucessfully uploaded.", "Upload", MessageBoxButton.OK, MessageBoxImage.Information); 
      this.DialogResult = true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error during file upload: " + ex.Message, "Upload", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 

    } 

還只是測試的視頻文件的客戶端功能,一部開拓創新的文件播放很高興,然後當我通過服務上傳它時,服務器上創建的文件將無法播放。

我相信這是一些真正愚蠢的我正在做的,但任何幫助真的很感激。

+0

忽略這個問題,我已經回答了它自己,但SO不會讓我關閉它。 – 2012-08-10 15:33:14

+0

如果你自己解決了它,你仍然應該發佈自己的答案,以防別人將來遇到同樣的問題。 – 2012-08-11 04:43:38

+0

我試過,但它不會讓我發佈答案,這就是爲什麼我留下評論,因爲這是我所能做的。這與聲譽得分和時間限制有關。 – 2012-08-11 23:19:58

回答

0

問題是我寫入文件流的方式,我實際上並沒有傳出文件的字節,而是使文件具有相同大小但基本沒有原始文件內容的新字節。

這是改變的代碼

//FileStream file = new FileStream(@"C:\bd_sites\ttgme\wwwroot\Evidence\{" + ed.LearnerID + @"}\" + ed.EvidenceFileName, FileMode.Create, System.IO.FileAccess.Write); 
//byte[] bytes = new byte[ms.Length]; 
////ms.Read(buffer, 0, (int)ms.Length); 
//file.Write(bytes, 0, bytes.Length); 
//file.Close(); 
//ms.Close(); 

using (FileStream fs = File.OpenWrite(@"C:\bd_sites\ttgme\wwwroot\Evidence\{" + ed.LearnerID + @"}\" + ed.EvidenceFileName)) 
{ 
    ms.WriteTo(fs); 
    fs.Close(); 
    ms.Close(); 
}