注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

ASP.NET 上传大文件介绍  

2011-07-29 17:32:48|  分类: asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在上一篇 文件上传和下载(一)中,我了解到了一些比较常用的知识。可是只能上传小于4MB的空间,显然不能满足需求,例如我们要上传PDF大文件以及视频格式的文件,显然上面的程序望而止步啦!怎么解决这个问题呢?

看到了网上的一些介绍,其中有一篇是上传大文件的难点,对这方面介绍的比较全。还有一篇则是在ASP.NET应用程序中上传文件,在这里面博主对文件上传的原理、自带控件、以及比较新颖的组件进行了详细的剖析。


首先来看一下FileUpload的用法

相信这个简单的界面大家并不陌生,先从最基本的开始。俗话说:“不积跬步,无以致千里”

/// <summary>

02 /// 文件上传
03 /// </summary>
04 /// <param name="postedFile">文件对象</param>
05 /// <param name="physicalPath">文件存放服务器的物理路径</param>
06 /// <param name="errMsg">输出:上传失败的错误信息</param>
07 /// <returns></returns>
08 public bool UploadFile(HttpPostedFile postedFile, string physicalPath, out string errMsg)
09 {
10 errMsg = string.Empty;
11 string fName = Path.GetFileName(postedFile.FileName);
12
13 //文件格式检查
14 string ext = fName.Substring(fName.LastIndexOf('.')).ToString();
15 if(ext != ".rar")
16 {
17 errMsg = "上传文件类型有误,请重新选择!";
18 return false;
19 }
20 <br> //判断附件大小是否超过4MB
21 if (fName == "") return false;
22 try
23 {
24 long fileSize = postedFile.ContentLength;
25 fileSize = fileSize / 1024;
26 if ((int)(fileSize / 1024) > 4)
27 {
28 errMsg = "您上传的文件超过4MB限制,请重新选择!";
29 return false;
30 }
31 }
32 catch (Exception ex)
33 {
34 errMsg = "错误" + ex.Message;
35 return false;
36 }
37 <br> //上传
38 string servFile = physicalPath + fName;
39 try
40 {
41 postedFile.SaveAs(servFile);
42 MsgAlter("文件上传成功!");
43 }
44 catch
45 {
46 errMsg = "文件上传失败!";
47 return false;
48 }
49 return true;
50 }
51
52 protected void btnSubmit_Click(object sender, EventArgs e)
53 {
54 string physicalPath = Server.MapPath("~/UploadFiles/");
55 string errMsg = string.Empty;
56
57 if (!UploadFile(FileUpload1.PostedFile, physicalPath, out errMsg))
58 {
59 MsgAlter(errMsg);
60 return;
61 }
62 }
63
64 private void MsgAlter(string msg)
65 {
66 ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('" + msg + "')</script>");
67 }

上面对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" CodeBehind="neatuplod.aspx.cs" Inherits="Web2.neatuplod" %>

<%@ 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></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>
        <table style="width: 100%;">
            <tr>
                <td>
                    &nbsp;
                </td>
                <td>
                    &nbsp;
                    <Upload:InputFile ID="AttachFile" runat="server" />
                </td>
                <td>
                    &nbsp;
                </td>
            </tr>
            <tr>
                <td>
                    &nbsp;
                </td>
                <td>
                    &nbsp;
                    <Upload:ProgressBar ID="ProgressBar" runat="server"  Width="500px" Height="300px" Inline="true"/>
                </td>
                <td>
                    &nbsp;
                </td>
            </tr>
            <tr>
                <td>
                    &nbsp;
                </td>
                <td>
                  
<asp:Button ID="Upload" runat="server" Text="Upload"  OnClientClick="ToggleVisibility('ProgressBar', 'on')" onclick="Upload_Click" />

                </td>
                <td>
                    &nbsp;
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

后台代码代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Brettle.Web.NeatUpload;

namespace Web2
{
    public partial class neatuplod : 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>节点下添加

1 <httpModules>
2 <add name="UploadHttpModule" type="Brettle.Web.NeatUpload.UploadHttpModule, Brettle.Web.NeatUpload"/><br></httpModules>

如果有httpModules节点,不需要再添加。只需添加<add name=""/>即可。如果没有修改web.config,进度条不显示。


 

  评论这张
 
阅读(526)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017