загрузка файла silverlight 4 на контроллер mvc 3 - PullRequest
0 голосов
/ 15 июня 2011

У меня есть страница 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");

Метод Push-данных ...

    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)
{ 
}

Параметр файла в моем контроллере равен нулю при вызове контроллера. Кто-нибудь знает, что я делаю не так?

Я видел примеры, которые реализуют IHttpHandler, но я пытаюсь избежать этого и придерживаюсь только прямых контроллеров mvc 3.

1 Ответ

0 голосов
/ 31 октября 2011

У меня была та же проблема, что и у вас.Я смог решить эту проблему другим способом.

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);
        }
    }
...