ASP.NET 上传大文件介绍
2010-09-21 17:16 czyhsl 阅读(401) 评论(0) 编辑 收藏 举报在上一篇 文件上传和下载(一)中,我了解到了一些比较常用的知识。可是只能上传小于4MB的空间,显然不能满足需求,例如我们要上传PDF大文件以及视频格式的文件,显然上面的程序望而止步啦!怎么解决这个问题呢?
看到了网上的一些介绍,其中有一篇是上传大文件的难点,对这方面介绍的比较全。还有一篇则是在ASP.NET应用程序中上传文件,在这里面博主对文件上传的原理、自带控件、以及比较新颖的组件进行了详细的剖析。
首先来看一下FileUpload的用法
相信这个简单的界面大家并不陌生,先从最基本的开始。俗话说:“不积跬步,无以致千里”
/// <summary> /// 文件上传 /// </summary> /// <param name="postedFile">文件对象</param> /// <param name="physicalPath">文件存放服务器的物理路径</param> /// <param name="errMsg">输出:上传失败的错误信息</param> /// <returns></returns> public bool UploadFile(HttpPostedFile postedFile, string physicalPath, out string errMsg) { errMsg = string.Empty; string fName = Path.GetFileName(postedFile.FileName); //文件格式检查 string ext = fName.Substring(fName.LastIndexOf('.')).ToString(); if(ext != ".rar") { errMsg = "上传文件类型有误,请重新选择!"; return false; }
//判断附件大小是否超过4MB if (fName == "") return false; try { long fileSize = postedFile.ContentLength; fileSize = fileSize / 1024; if ((int)(fileSize / 1024) > 4) { errMsg = "您上传的文件超过4MB限制,请重新选择!"; return false; } } catch (Exception ex) { errMsg = "错误" + ex.Message; return false; }
//上传 string servFile = physicalPath + fName; try { postedFile.SaveAs(servFile); MsgAlter("文件上传成功!"); } catch { errMsg = "文件上传失败!"; return false; } return true; } protected void btnSubmit_Click(object sender, EventArgs e) { string physicalPath = Server.MapPath("~/UploadFiles/"); string errMsg = string.Empty; if (!UploadFile(FileUpload1.PostedFile, physicalPath, out errMsg)) { MsgAlter(errMsg); return; } } private void MsgAlter(string msg) { ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('" + msg + "')</script>"); }
上面对FileUpload进行了简单介绍,默认只允许上传.rar文件,如果想上传其他格式的文件,只需在后台代码调整下具体的文件格式即可。
在阅读别人的博客中,意外发现了NeatUpload,它可以在ASP.NET中使用,能够将上传的文件存在硬盘中或者Sql Server数据库中。NeatUpload提供了两个服务器控件:<NeatUpload:InputFile>和<NeatUpload:ProgressBar>,前者用于代替<asp:FileUpload>,可以通过它访问到用户通过特定框上传的内容;后者则是一个进度条显示控件,负责使用弹出窗口或内联的形式显示上传的进度。弹出窗口自不必说,而所谓的“内联”方式其实只是在页面中嵌入一个iframe元素,然后通过不断刷新iframe中的页面来进行进度展示--可见它和弹出窗口显示方式的区别仅仅在页面所处的位置。当然,如果我们希望移植为形式也不难,只需开发一个页面,继承NeatUpload提供的ProgressPage类,并通过ProgressPage所提供的一些属性(总字节数、已上传字节数、已花时间等等)来获得当前上传的进度,最后直接使用Response.Write输出JSON形式的数据即可。事实上原本在iframe(或)新窗口的页面,也是继承了ProgressPage类,并且使用HTML的方式进行呈现而已,本质上并没有太大的区别。
NeatUpload下载地址:http://neatupload.codeplex.com
具体的使用可以看下面的介绍:
1、在工具箱中点右键选“选择项”,将Brettle.Web.NeatUpload.dll添加到工具箱,添加后就可以看到相应的控件
2、新建一个web项目
首先看一下前台显示页面Default.aspx,具体代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Assembly="Brettle.Web.NeatUpload" Namespace="Brettle.Web.NeatUpload" TagPrefix="Upload" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>NeatUpload</title> <script type="text/javascript" language="javascript"> function ToggleVisibility(id, type) { el = document.getElementById(id); if(el.style) { if(type == 'on') { el.style.display = 'block'; } else { el.style.display = 'none'; } } else { if(type == 'on') { el.display = 'block'; } else { el.display = 'none'; } } } </script> </head> <body> <form id="form1" runat="server"> <div> <Upload:InputFile ID="AttachFile" runat="server" /> <asp:Button ID="Upload" runat="server" Text="Upload" OnClientClick="ToggleVisibility('ProgressBar', 'on')" onclick="Upload_Click" /> <div id="ProgressBar"> <Upload:ProgressBar ID="pbProgressBar" runat='server' Width="500px" Height="300px" Inline="true"> </Upload:ProgressBar> </div> </div> </form> </body> </html>
后台代码Default.aspx.cs代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using Brettle.Web.NeatUpload; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Upload_Click(object sender, EventArgs e) { string FileName = this.AttachFile.FileName;//获取上传文件的全路径 string ExtenName = Path.GetExtension(FileName);//获取扩展名 string SaveFileName = Path.Combine(Request.PhysicalApplicationPath, DateTime.Now.ToString("yyyyMMddhhmm") + ExtenName);//合并两个路径为上传到服务器上的全路径 if (this.AttachFile.ContentLength > 0) { try { this.AttachFile.MoveTo(SaveFileName, MoveToOptions.Overwrite); } catch (Exception ex) { throw ex; } } } }
3、修改web.config
在<system.web>节点下添加
<httpModules> <add name="UploadHttpModule" type="Brettle.Web.NeatUpload.UploadHttpModule, Brettle.Web.NeatUpload"/>
</httpModules>
如果有httpModules节点,不需要再添加。只需添加<add name=""/>即可。如果没有修改web.config,进度条不显示。
做到这里,程序就可以运行了,默认的进度条样式是可以修改的。主要是修改default.css、Progress.aspx、ProgressBar控件的属性。中秋节啦!弄了半天就这么点眉目,也祝博客园的兄弟姐妹们中秋快乐...