silverlight 4文件上传到mvc 3控制器HttpPostedFileBase为null

时间:2011-06-14 21:00:18

标签: asp.net-mvc-3 silverlight-4.0 file-upload

我有一个mvc 3页面,我希望能够使用silverlight将图像上传到我的网站进行上传,并在上传时显示进度条和取消按钮。但是我在控制器中为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)
{ 
}

调用控制器时,控制器中的文件参数为null。谁知道我做错了什么?

我见过实现IHttpHandler的例子,但我试图避免这样做并坚持使用直接的mvc 3控制器。

1 个答案:

答案 0 :(得分: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);
        }
    }
相关问题