ASP.NET 上传大文件介绍

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


转载于:https://www.cnblogs.com/czyhsl/archive/2010/09/21/1832742.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值