我有一个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控制器。
答案 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);
}
}