asp.net超大文件上传方法

asp教程.net超大文件上传方法

asp.net教程大文件上传是一个不完善和有缺陷的领域,相信在不久会得到提高和发展,如果你已经解决了,说明你在一个好公司,否则你可以考虑使用第三方产品来解决了。文件上传的问题,我们都能够找到很多种不同的方法来解决,挑战在于找出不同做法的利弊然后找到一个适用于自己项目的方案,这不仅仅是在文件上传这一个方面!

 

<asp:image id="imglogo" runat="server" /><br/>
<asp:label id="labmsg" runat="server" forecolor="#cc0000"></asp:label><br />
<asp:fileupload id="uploadlogo" runat="server" width="60%" height="22px"/> &nbsp;&nbsp;
<asp:button id="btnupload" runat="server" text=" 上传 " onclick="btnupload_click"/>

aspx.cs页面

// 上传按钮

protected void btnupload_click(object sender, eventargs e)
{
    uploadfile uploadfileobj = new uploadfile(); //实例化文件上传类
    uploadfileobj.maxfilesize = 100;  // 设置上传文件最大长度,单位k
    uploadfileobj.filetype = "jpg|jpeg|gif|png";  // 设置允许上传的文件类型

    string uploadpath = server.mappath("~/uploadfiles/other/"); // 设置上传目录全路径
    uploadfileobj .uploadfilego(uploadpath, uploadlogo); //文件上传
    labmsg.text = uploadfileobj.uploadinfo; // 上传消息提示
    if (uploadfileobj.uploadstate == true)
    {
        imglogo.imageurl = "~/uploadfiles/other/" + uploadfileobj.newfilename; // 显示图片
    }
   
}

uploadfile.cs 文件上传类

using system;
using system.data;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;

namespace common
{
    /// <summary>文件上传类</summary>
    public class uploadfile
    {

        #region 字段

        private string _uploadinfo; // 文件上传的返回信息。
        private bool _uploadstate; // 文件上传的返回状态。
        private string _filetype; // 允许上传文件的类型。
        private int _filesize; // 上传文件的大小,单位b
        private int _maxfilesize; // 上传文件大小的最大长度,单位b
        private string _newfilename; // 上传后的文件名。

        #endregion

 

        /// <summary>初始文件上传类(默认)</summary>
        public uploadfile()
        {
            _uploadinfo = "none";
            _uploadstate = false;
            _filetype = "*";
            _maxfilesize = 1024000;//1000k 即1024*1000b,单位b
            _newfilename = "";
        }
       
        #region 属性
        /// <summary>文件上传的返回信息</summary>
        public string uploadinfo
        {
            set { _uploadinfo = value; }
            get { return _uploadinfo; }
        }

        /// <summary>文件上传的返回状态,成功true,失败false</summary>
        public bool uploadstate
        {
            set { _uploadstate = value; }
            get { return _uploadstate; }
        }

        /// <summary>允许上传文件的类型,* 默认代表可任意类型,或自定义类型,如 "jpg|gif|bmp"</summary>
        public string filetype
        {
            set { _filetype = value; }
            get { return _filetype; }
        }

        /// <summary>上传文件的大小,单位k</summary>
        public int filesize
        {
            get { return _filesize / 1024; }
        }

        /// <summary>上传文件大小的最大长度,单位k</summary>
        public int maxfilesize
        {
            set { _maxfilesize = value * 1024; }
            get { return _maxfilesize / 1024; }
        }

        /// <summary>上传后的文件名</summary>
        public string newfilename
        {
            set { _newfilename = value; }
            get { return _newfilename; }
        }

        #endregion

        #region 上传主程序
        /// <summary>上传本地文件到服务器</summary>
        /// <param name="strsavedir">在服务器端保存的物理路径。</param>
        /// <param name="fileuploadctrlid">上传的文件对象,这里使用的是fileupload控件,</param>
        /// <param>第二个参数如果是html input(file)控件可改为:htmlinputfile htmctrlobjuploadfile</param>
        /// <returns></returns>
        public void uploadfilego(string strsavedir, fileupload fileuploadctrlid)
        {
            int intfileextpoint = fileuploadctrlid.postedfile.filename.lastindexof("."); //最后一个 . 号的位置
            string strfileextname = fileuploadctrlid.postedfile.filename.substring(intfileextpoint + 1).tolower(); // 获取上传文件的后缀名。

            _filesize = fileuploadctrlid.postedfile.contentlength;//上传的文件大小 byte

            if (_filesize == 0) // 判断是否有文件需要上传或所选文件是否为0字节。
            {
                _uploadinfo = "没有选择要上传的文件或所选文件大小为0字节";
                _uploadstate = false;
                return; // 返回文件上传状态和信息。
            }

            if (_filesize > _maxfilesize) // 限制要上传的文件大小(byte)。
            {
                _uploadinfo = "上传的文件超过限制大小(" + (_maxfilesize / 1024).tostring() + "k)";
                _uploadstate = false;
                return; // 返回文件上传状态和信息。
            }

            if (_filetype != "*")
            {
                if (_filetype.tolower().indexof(strfileextname.tolower().trim()) == -1) // 判断要上传的文件类型的是否在允许的范围内。
                {
                    _uploadinfo = "不允许上传的文件类型(允许的类型:|" + _filetype + ")";
                    _uploadstate = false;
                    return; // 返回文件上传状态和信息
                }
            }

            if (_newfilename == "")
            {
                datetime dtenow = datetime.now; // 定义日期对象,为上传后的文件命名。
                _newfilename = dtenow.year.tostring() + dtenow.month.tostring() + dtenow.day.tostring() + getrandomstr(8); // 随机地为上传后的文件命名,日期+随机数。
                _newfilename = _newfilename + "." + strfileextname; //包含扩展名的文件名
            }
            fileuploadctrlid.postedfile.saveas(this.getsavedirectory(strsavedir) + _newfilename); // 以新的文件名保存上传的文件到指定物理路径。          
            _uploadinfo = "文件上传成功"; // 返回上传后的服务器端文件物理路径。
            _uploadstate = true;

        }
        #endregion

 

        /// <summary>获取指定位数的随机数</summary>
        /// <param name="rndnumcount">随机数位数。</param>
        /// <returns></returns>
        private string getrandomstr(int rndnumcount)
        {
            string randomstr;
            randomstr = "";
            random rnd = new random();
            for (int i = 1; i <= rndnumcount; i++)
            {
                randomstr += rnd.next(0, 9).tostring();
            }
            return randomstr;
        }

 

        /// <summary>获取上传文件存放目录</summary>
        /// <param name="directorypath">存放文件的物理路径。</param>
        /// <returns>返回存放文件的目录。</returns>
        public string getsavedirectory(string directorypath)
        {
            if (!directory.exists(directorypath)) // 判断当前目录是否存在。
            {
                directory.createdirectory(directorypath); // 建立上传文件存放目录。
            }
            return directorypath;
        }

    }

 

    #region 附:修改上传大小的配置
    /*
    需要修改的是
    在 c:windowsmicrosoft.netframeworkv1.1.4322config目录里,
    找到文件maxrequestlength="4096"
    将值修改大一些,例如:102400
    这个参数的单位应该是kb的

    以上方法是修改全局的,如果公需要修改一个项目,那么是修改项目里的web.config文件

    在<system.web></system.web>之间添加,
    <httpruntime usefullyqualifiedredirecturl="true" maxrequestlength="21000" executiontimeout="300" />
    其中,
    maxrequestlength:设置上传文件的最大值,单位:kb。(默认是4096kb,即4m)
    executiontimeout:设置超时时间,单位:秒。(默认是90秒)
    */
    #endregion
}

neatupload是在asp.net pipeline的beginrequest事件中截获当前的httpworkerrequest对象,然后直接调用其readentitybody等方法获取客户端传递过来的数据流,并加以分析和处理。并通过使用新的请求进行轮询来获取当前上传的状态。关于neatupload和其他开源组件的介绍可以参看jeffreyzhao的在asp.net应用程序中上传文件,当然他还说了memba velodoc xp edition和swfupload

时间: 2024-12-09 10:33:31

asp.net超大文件上传方法的相关文章

ASP.NET 常用 文件上传方法第1/2页_实用技巧

本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以及下载方法 4.上传Internet上的资源 第一部分: 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下: 复制代码 代码如下: <httpRuntime executionTimeout="300" maxR

ASP中实现文件上传方法的研究

上传 摘要:在基于浏览器/服务器的应用环境中,在浏览器中上传各种类型的文件一直是困扰用户文件管理应用的难题之一.在HTTP中上传文件有三种机制:RFC1867,PUT和WebDAV.常用的实现方法是利用在RFC1867中引入的一个新类型:File以及ADO Stream对象.本文对上述上传方法及实现原理作了论述,并给出了具体解决实例. 关键词:ASP 组件 FILE对象 当前,基于浏览器/服务器模式的应用比较流行.当用户需要将文件传输到服务器上时,常用方法之一是运行FTP服务器并将每个用户的FT

Asp.Net超大文件上传问题解决_实用技巧

  最近涉及到用asp.net做上传功能的一个问题,因为asp.net有fileupload的上传控件,但是这个控件上传的文件大小有限,所以根本满足不了需求百度了下,很多人遇到asp.net上传超大文件的困惑,偶尔搜索发现csdn有个哥们提到这个超大文件如何实现,RadUpload.Net2.dll并且提供了这个动态库进行处理超大文件的上传处理过程.于是就下载下来看了看,果然效果不错,不但支持吵过700M的文件上传快速,更重要的是支持多线程的上传文件.查看源代码发现利用的控件也是fileuplo

技巧应用:ASP.NET中文件上传下载方法集合

asp.net|集合|技巧|上传|下载|中文 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以及下载方法 4.上传Internet上的资源 第一部分: 首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大

ASP.NET中文件上传下载方法集合

asp.net|集合|上传|下载|中文 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以及下载方法 4.上传Internet上的资源 第一部分: 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为

ASP.NET多文件上传控件Uploadify的使用方法_实用技巧

对于Uploadify文件上传之前已经讲过一次(文件上传~Uploadify上传控件),只不过没有涉及到多文件的上传,这回主要说一下多个文件的上传,首先,我们要清楚一个概念,多文件上传前端Uploadify是通过轮训的方式去调用我们的后台upload程序的,所以,对于多文件上传来说,也没什么稀奇的. 下面是文件上传后的缩略图如下 列表的组装使用JS模板,这样对于复杂的HTML结构来说,可以减少拼写错误的出现,关闭是将LI元素从UI元素移除,最后提交时,从UI里检查LI元素,然后对它进行组装,并进

超大文件上传(10G)

问题描述 最近在做javaweb的超大文件上传,基本要实现10G以上的文件的需求,本人初学,请各位大侠指点一二. 解决方案 解决方案二:commons-upload解决方案三:jspsmart.jarcommons-fileupload-1.2.2.jar类publicclassUploadServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsSe

文件上传方法

文件上传是很早以前的事了,最早那会常用的就是IPC连接,然后一个一个的COPY,自从动网upfile漏洞出来以后,各种脚本系统如PHP.JSP下的文件漏洞纷纷暴出,原理都是大同小异,没有过滤文件上传路径,导致可以抓包然后把空格20改成00,变成空字符NULL,系统是从右往左识别的,所以到空字符那就截断了,更简单的就是过滤文件上传类型不完整,改后缀就可以解决了,这些上传文件的漏洞,用万能上传工具就可以轻松搞定,不过漏洞文件名不同罢了. 还有一些另类的文件上传方法,是在系统做了比较好的防范下完成的,

ASP.NET MVC文件上传教程(二)_实用技巧

上文ASP.NET MVC 文件上传教程(一)我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意的地方,及时进行查漏补缺,尽量将这一块完善起来. 引入 上一节我们讲到了上传这一块,有朋友提出未涉及到大文件的上传这一块,思前想后还是来试着做做,毕竟之前没怎么去仔细考虑过这个问题,尤其还可以联系实际开发中创建文件夹等一系列问题,同时关于上传在网上随便找找都充斥着大量的组件,我们何必再