在asp.net mvc中使用Uploadify上传文件

一、Uploadify控件

      在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好,无刷新,带上传进度等等。在最近的一个webform开发项目中,我就是使用的Uploadify,虽然有些小瑕疵,但是基本上还是满意的(在webform中使用Uploadify可以参考《JQuery上传插件Uploadify使用详解》),所以当现在使用MVC开发的时候,自然将之作为首选。

 

Uploadify官方Demo


二、在MVC中使用Uploadify

首先引入js和css文件:

<script src="/Content/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="/Content/Scripts/swfobject.js" type="text/javascript"></script>
<script src="/Content/Scripts/jquery.uploadify.v2.1.0.min.js" type="text/javascript"></script>
<link href="/Content/Styles/uploadify.css" rel="stylesheet" type="text/css" />

 

 在页面上放一个最普通的file控件(其中checkImport是我自己写的一个验证方法,当没有选择上传文件的时候警告):

<div>
<p><input id="fileInput1" name="fileInput1" type="file"/></p>
<p style="margin-top:5px;font-size:14px;font-weight:bold;">
<a href="javascript:if(checkImport()){$('#fileInput1').uploadifyUpload();}">导入文件</a></p>
<p style="margin-top:5px;font-size:14px;font-weight:bold;"><span id="result"></span></p>
</div>

 

然后就可以加入如下js,其中script就是请求服务器的一个处理地址,在webform中通常是指向一个aspx或者ashx文件,在MVC中则是请求一个action,比如这里就是请求ExcelController的Import方法(我的路由是"Admin/{controller}/{action}/{id}"):

 

$(function() {
//上传
$('#fileInput1').uploadify({
'uploader': '/Content/Images/uploadify.swf',
'script': '/Admin/Excel/Import',
'folder': '/UploadFiles',
'cancelImg': '/Content/Images/cancel.png',
'fileExt': '*.xls',
'fileDesc': '*.xls',
'sizeLimit': 1024 * 1024 * 4, //4M
'multi': false,
'onComplete': fun
});

});
function fun(event, queueID, fileObj, response, data) {
if (response != "") {
showInfo(
"成功上传"+response, true); //showInfo方法设置上传结果
}
else {
showInfo(
"文件上传出错!", false);
}
}

 

在对应的ExcelController中就可以这么写:

 

[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Import(HttpPostedFileBase FileData, string folder)
{
string result = "";
if (null != FileData)
{
try
{
result
= Path.GetFileName(FileData.FileName);//获得文件名
string ext = Path.GetExtension(FileData.FileName);//获得文件扩展名
string saveName = "uploadfile" + ext;//实际保存文件名
saveFile(FileData, folder, saveName);//保存文件
}
catch
{
result
= "";
}
}
return Content(result);
}

[NonAction]
private void saveFile(HttpPostedFileBase postedFile, string filepath, string saveName)
{
string phyPath = Request.MapPath("~" + filepath + "/");
if (!Directory.Exists(phyPath))
{
Directory.CreateDirectory(phyPath);
}
try
{
postedFile.SaveAs(phyPath
+ saveName);
}
catch (Exception e)
{
throw new ApplicationException(e.Message);

}
}

 

注意两个参数FileData和folder都是固定名称的,并且FileData的参数类型是HttpPostedFileBase而不是HttpPostedFile(我刚开始就是在这里纠结很久,总是取不到文件),关于为什么要使用HttpPostedFileBase,我在网上找到这样一段话,看来是由于单元测试的原因吧。。。

 

Just work with it as an HttpPostedFileBase. The framework uses the HttpPostedFileWrapper 
 to convert an HttpPostedFile to an object of HttpPostedFileBase. HttpPostedFile is 
one of those sealed classes that are hard to unit test with. I suspect that sometime 
after the example was written they applied the wrapper code to improve the ability 
to test(using HttpPostedFileBase) controllers in the MVC framework. Similar things 
have been done with the HttpContext, HttpRequest, and HttpReponse properties on the controller.

 

 

成功上传文件后的效果如下:

 

实例程序下载

标签: mvc, uploadify, 上传
posted @ 2010-07-07 15:38 imdingji 阅读(2463) 评论(16) 编辑 收藏

 回复 引用 查看   
#1楼2010-07-16 14:50 | fener      
不错。。学习下。。
 回复 引用 查看   
#2楼2010-08-18 13:57 | flashpast      
有没有源码,谢谢
 回复 引用 查看   
#3楼[楼主]2010-08-18 16:45 | imdingji      
@flashpast
我上传了一份代码,你下载试试看

 回复 引用 查看   
#4楼2010-08-23 15:27 | flashpast      
@imdingji
谢谢

 回复 引用 查看   
#5楼2011-01-22 12:16 | 永生牵恋      
@imdingji
where are you code?

 回复 引用 查看   
#6楼[楼主]2011-01-22 14:47 | imdingji      
@永生牵恋
你是指编程环境吗?VS2008

 回复 引用 查看   
#7楼2011-01-22 17:35 | 永生牵恋      
引用imdingji:
@永生牵恋
你是指编程环境吗?VS2008

在Controller中如何获取上传之后的文件的文件名呢?如果想改变上传后文件的命名规则在哪里改呢?

 回复 引用 查看   
#8楼[楼主]2011-01-22 18:23 | imdingji      
@永生牵恋
文章中有写到的,请注意看
result = Path.GetFileName(FileData.FileName);//获得文件名
string ext = Path.GetExtension(FileData.FileName);//获得文件扩展名
string saveName = "uploadfile" + ext;//实际保存文件名

 回复 引用 查看   
#9楼2011-01-22 19:09 | 永生牵恋      
@imdingji
多谢了,呵呵
还有个问题请教一下,项目重新启动后,上传就不起作用了,似乎是AJAX缓存的问题?如何解决啊?

 回复 引用 查看   
#10楼2011-01-22 19:42 | 永生牵恋      
有解决方案了,浏览器把SWF文件缓存了,致使上传不起作用,修改一下这行为:
'uploader': '/Content/Images/uploadify.swf?var=' + (new Date()).getTime(),
即可!

 回复 引用 查看   
#11楼[楼主]2011-01-22 19:44 | imdingji      
@永生牵恋
这是IE独有的缓存问题,很久之前就有了,加随机数的做法是其中一种解决方法

 回复 引用 查看   
#12楼2011-01-24 11:36 | 我-大熊      
好文
 回复 引用 查看   
#13楼2011-03-24 11:01 | xiaxue0525      
演示失败。鉴定完毕。

 回复 引用 查看   
#14楼2011-10-27 17:34 | 腾飞刘      
怎么换掉黑黑的“浏览”两个字啊?
 回复 引用 查看   
#15楼[楼主]2011-10-27 17:39 | imdingji      
@腾飞刘
你是指修改按钮的文字吗?

 回复 引用 查看   
#16楼2011-11-14 10:05 | 迈克尔二孬      
HttpPostedFileBase FileData不必作为输入参数,Request.Files[0]可以直接取得。