2011-06-14 69 views
0

我有一個mvc 3頁面,我希望能夠使用silverlight將圖像上傳到我的網站上傳並在上傳時顯示進度欄和取消按鈕。但我一直在我的控制器爲HttpPostedFileBase參數獲取空值。silverlight 4文件上傳到mvc 3控制器HttpPostedFileBase爲空

這裏是我的Silverlight上傳代碼...

 var client = new WebClient(); 
     client.Headers[HttpRequestHeader.ContentType] = "multipart/form-data"; 
     client.OpenWriteCompleted += (sender1, e1) => 
     {      
      PushData(stream, e1.Result); 
      e1.Result.Close(); 
      stream.Close(); 
     }; 

     client.UploadProgressChanged += (sender1, e1) => 
     { 
      this.pbStatus.Value = e1.ProgressPercentage; 
     }; 

     // get uri from params 
     param = App.Current.Host.InitParams["url"]; 
     var uri = new Uri(param, UriKind.Relative); 
     client.OpenWriteAsync(uri, "POST"); 

數據推法...

private void PushData(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[4096]; 
     int bytesRead; 

     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 
    }               

我的控制器代碼...

[HttpPost] 
public ActionResult UploadTexture(HttpPostedFileBase file) 
{ 
} 

文件PARAM在控制器被調用時,在我的控制器中爲null。任何人都知道我在做什麼錯了?

我見過實現一個IHttpHandler的例子,但我試圖避免這樣做,並堅持使用直接mvc 3控制器。

回答

0

我遇到了和你一樣的問題。我以另一種方式解決了這個問題。

foreach (FileInfo fi in uploadedFiles) 
     { 
      UriBuilder ub = new UriBuilder(Application.Current.Host.Source.Host + "/Excel/?fileName=" + fi.Name); 
      WebClient wc = new WebClient(); 
      wc.Headers[HttpRequestHeader.ContentType] = "multipart/form-data"; 
      wc.OpenWriteCompleted += (sender, e) => 
      { 
       FileStream data = fi.OpenRead(); 
       PushData(data, e.Result); 
       e.Result.Close(); 
       data.Close(); 
      }; 
      wc.OpenWriteAsync(ub.Uri, "POST"); 
     } 

您將看到的主要區別是我將文件名附加到URL。我的PushData()是一樣的。在MVC方面,我有:

[HttpPost] 
    public ActionResult Index(string fileName) 
    { 
     using (FileStream fs = System.IO.File.Create(Server.MapPath("~/FilesExcel/" + fileName))) 
     { 
      SaveFile(Request.InputStream, fs); 
     } 

     return View(); 
    } 

    private void SaveFile(Stream stream, FileStream fs) 
    { 
     byte[] buffer = new byte[4096]; 
     int bytesRead; 

     while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      fs.Write(buffer, 0, bytesRead); 
     } 
    }