在上一篇 文件上传和下载(一)中,我了解到了一些比较常用的知识。可是只能上传小于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')" οnclick="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控件的属性。中秋节啦!弄了半天就这么点眉目,也祝博客园的兄弟姐妹们中秋快乐...