NeatUpload是一个开源的大文件上传控件,非常的强大,支持文件类型过滤、上传进度条显示、多文件上传等强大的功能。最近在工作中使用Brettle.Web.NeatUpload.dll上传视频文件,在参考网上其他资料的基础上写了如下的使用记录:
1、 下载Brettle.Web.NeatUpload.dll,并在项目中添加引用;
2、 复制文件夹“NeatUpload”到项目根目录;
3、 在配置文件的<system.web>节点中添加如下配置:
<httpModules>
<!—使用NeatUpload控件及需要显示上传进度条-->
<add name="UploadHttpModule" type="Brettle.Web.NeatUpload.UploadHttpModule, Brettle.Web.NeatUpload" />
</httpModules>
4、 在上传文件的页面中引用该控件:
A、 页面代码:
添加上传控件:
B、 后台事件:
/// <summary>
/// 上传图片或者视频
/// </summary>
protected void UploadFile()
{
if (this.file_UpLoad.HasFile)
{
string fileType = Path.GetExtension(file_UpLoad.FileName.ToLower());
if (fileType != ".flv")
{
this.errorMsg.Text = "必须上传.flv文件!!";
return;
}
//上传文件的重命名
HiddenFile.Value = SetFileName(file_UpLoad.FileName);
//获取配置文件中限定的上传文件大小,这里设定显示2G,用户可以自定义
long size = (long)(Convert.ToInt32(ConfigurationManager.AppSettings["bigfile"])) * 1024 * 1024 * 1024;
//获取上传文件的大小
long longth2 = file_UpLoad.ContentLength;
if (longth2 > size)
{
this.errorMsg.Text = string.Format("单个文件不能超过{0}G!!", ConfigurationManager.AppSettings["bigfile"]);
return;
}
try
{
//把文件上传到指定的目录下,第一参数表示文件报错的路径和文件名称,这里把文件保存在根目录下的UpLoads文件夹中
file_UpLoad.MoveTo(Path.Combine(Request.PhysicalApplicationPath + "//UpLoads", HiddenFile.Value),
Brettle.Web.NeatUpload.MoveToOptions.Overwrite);
this.errorMsg.Text = "上传成功!!";
}
catch (Exception ex)
{
this.errorMsg.Text = "上传异常!!";
return;
}
}
}
/// <summary>
/// 重新命名文件名称
/// </summary>
protected string SetFileName(string filename)
{
int index = filename.IndexOf(".");
string extension = filename.Substring(index);//扩展名
string fName = Guid.NewGuid().ToString() + extension; return fName;
}
5、完成以上4个步骤后,上传大文件的功能是已经完全实现的了,但是如果项目中其他地方使用普通的FileUpload上传时会发生了一个错误(Nonfile portion > 4194304 bytes,文件大于默认值4M),这时全站都会默认使用此httpModule,当你使用FileUpload上传文件时,只要是超过4M(默认的)的都不能上传,就算在配置文件中修改了普通的FileUpload上传大小的限制值(默认值允许上传2M的文件)<!--asp.net,默认只允许上传2M文件,增加如下配置,一般可以自定义最大文件大小.最大163840K,即160M -->
<httpRuntime executionTimeout="300" maxRequestLength="163840" useFullyQualifiedRedirectUrl="false " />都没用,还是会出现Nonfile portion > 4194304 bytes的错误的。
解决方法如下:
1)、首先在<configuration>节点中添加:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<sectionGroup name="system.web">
<section name="neatUpload" type="Brettle.Web.NeatUpload.ConfigSectionHandler, Brettle.Web.NeatUpload" allowLocation="true" />
</sectionGroup>
</configSections>
2)、然后在 <system.web>节点中添加:
<neatUpload useHttpModule="false" maxNormalRequestLength="4096" maxRequestLength="2097151" defaultProvider="FilesystemUploadStorageProvider">
<providers>
<add name="FilesystemUploadStorageProvider" type="Brettle.Web.NeatUpload.FilesystemUploadStorageProvider, Brettle.Web.NeatUpload"/>
</providers>
</neatUpload>
3)、最后在<configuration>节点中添加:
<!--上传文件的页面路径-->
<location path="VideoAdd.aspx" >
<system.web>
<!--为true则代表使用neatUpload的httpModule,false为不使用-->
<neatUpload useHttpModule="true" /> <httpRuntime maxRequestLength="2097151" executionTimeout="3600" useFullyQualifiedRedirectUrl="true" />
<!--允许最大为40M-->
</system.web>
</location>