`
shirlly
  • 浏览: 1647671 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

[转]ASP.NET中常用的文件上传下载方法

    博客分类:
  • .NET
阅读更多
   文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:
1、如何解决文件上传大小的限制
2、以文件形式保存到服务器
3、转换成二进制字节流保存到数据库以及下载方法
4、上传Internet上的资源

第一部分:
    首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:
<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>
这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。实现方法如下:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}

这样就可以解决了大文件的上传问题了。

第二部分:
    下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息
首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。
public class FileUpLoad
{
   public FileUpLoad()
   {

   }
/**//// <summary>
        /// 上传文件名称
        /// </summary>
        public string FileName
        {
            get
            {
                return fileName;
            }
            set
            {
                fileName = value;
            }
        }
        private string fileName;

        /**//// <summary>
        /// 上传文件路径
        /// </summary>
        public string FilePath
        {
            get
            {
                return filepath;
            }
            set
            {
                filepath = value;
            }
        }
        private string filepath;

        
        /**//// <summary>
        /// 文件扩展名
        /// </summary>
        public string FileExtension
        {
            get
            {
                return fileExtension;
            }
            set
            {
            
                fileExtension = value;
            }
                
        }
        private string fileExtension;
}


另外我们还可以在配置文件中限制上传文件的格式(App.Config):




<?xml version="1.0" encoding="gb2312" ?>
<Application>    
    <FileUpLoad>
       <Format>.jpg|.gif|.png|.bmp</Format>
    </FileUpLoad>
</Application>


这样我们就可以开始写我们的上传文件的方法了,如下:

public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)
        {
            
            FileUpLoad fp = new FileUpLoad();

            string fileName,fileExtension;
            string saveName;
            
            //
            //建立上传对象
            //
            HttpPostedFile postedFile = InputFile.PostedFile;

            fileName        = System.IO.Path.GetFileName(postedFile.FileName);
            fileExtension    = System.IO.Path.GetExtension(fileName);
            
            //
            //根据类型确定文件格式
            //
            AppConfig app = new AppConfig();
            string format = app.GetPath("FileUpLoad/Format");


            //
            //如果格式都不符合则返回
            //
            if(format.IndexOf(fileExtension)==-1)
            {
                throw new ApplicationException("上传数据格式不合法");
            }
                
            //
            //根据日期和随机数生成随机的文件名
            //
            if(myfileName != string.Empty)
            {
                fileName = myfileName;            
            }

            if(isRandom)
            {
                Random objRand = new Random();
                System.DateTime date = DateTime.Now;
                //生成随机文件名
                saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() 

                    + date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
                fileName = saveName + fileExtension;
            }
            
            string phyPath = HttpContext.Current.Request.MapPath(filePath);


            //判断路径是否存在,若不存在则创建路径
            DirectoryInfo upDir = new DirectoryInfo(phyPath);
            if(!upDir.Exists)
            {
                upDir.Create();
            }

            //
            //保存文件
            //
            try
            {
                postedFile.SaveAs(phyPath + fileName);

                fp.FilePath =  filePath  + fileName;
                fp.FileExtension = fileExtension;
                fp.FileName = fileName;
            }
            catch
            {
                throw new ApplicationException("上传失败!");
            }


            //返回上传文件的信息
            return fp;
        
        
        }


然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。

第三部分:
    这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:



public byte[] UpLoadFile(HtmlInputFile f_IFile)
{
         //获取由客户端指定的上传文件的访问
         HttpPostedFile upFile=f_IFile.PostedFile;
         //得到上传文件的长度
                int upFileLength=upFile.ContentLength; 
         //得到上传文件的客户端MIME类型
                string contentType = upFile.ContentType;
                byte[] FileArray=new Byte[upFileLength];
 
                Stream fileStream=upFile.InputStream; 
                
                fileStream.Read(FileArray,0,upFileLength);
        
        return FileArray;

}


这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:
首先,在Web.config中加入:
<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:

using System;
using System.Data;
using System.Web;
using System.IO;
using Ruixin.WorkFlowDB;
using RXSuite.Base;
using RXSuite.Component;
using RuixinOA.BusinessFacade;

namespace RuixinOA.Web.BaseClass
{
    /**//// <summary>
    /// NetUFile 的摘要说明。
    /// </summary>
    public class OpenFile : IHttpHandler
    {
        public void ProcessRequest(HttpContext context) 
        {
            
            //从数据库中取出要下载的文件信息
            RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();
            EntityData data = os.GetFileDetail(id);

            if(data != null && data.Tables["RX_OA_File"].Rows.Count > 0)
            {
                DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];

                context.Response.Buffer = true;
                context.Response.Clear();
                context.Response.ContentType = dr["CContentType"].ToString(); 
                context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
                context.Response.BinaryWrite((Byte[])dr["CContent"]);
                context.Response.Flush();
                context.Response.End();
            }
                        

        }

        public bool IsReusable 
        { 

            get { return true;} 
        }
    }
}



执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。

第四部分:

    这一部分主要说如何上传一个Internet上的资源到服务器。前面我们有一篇文章详细介绍了使用方法,这里我不再多说。
请参考:将动态页面转化成二进制字节流


转自:http://www.cnblogs.com/pw/archive/2006/05/24/408427.html
分享到:
评论

相关推荐

    asp.net 批量上传文件

    在ASP.NET中实现批量文件上传是一项常见的需求,尤其在处理大量用户数据时。在这个场景下,我们可以使用jQuery库中的`jquery.form`插件来增强页面的交互性,并结合ASP.NET后端技术,实现异步、无刷新的批量文件上传...

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

    ASP.NET中的文件上传下载是开发Web应用程序时必不可少的功能。本文主要涵盖了四个关键知识点: 1. 解决文件上传大小限制: 默认情况下,ASP.NET允许的最大文件上传大小为2MB。要增加这个限制,可以通过修改Web....

    【ASP.NET编程知识】ASP.NET Core文件上传与下载实例(多种上传方式).docx

    在文件上传和下载中,需要注意安全性问题,例如,文件上传的验证、文件类型的限制、文件大小的限制等。同时,需要使用 HTTPS 来保护文件上传和下载的过程。 知识点8: ASP.NET Core 的发展 ASP.NET Core 2.0 已经很...

    【ASP.NET编程知识】asp.net单文件带进度条上传的解决方案.docx

    在本文中,我们使用ASP.NET缓存机制来缓存文件上传的信息,然后使用ajax方法来获取缓存的信息,并将其显示在进度条上。 知识点3:使用Guid唯一标识文件上传 在本文中,我们使用Guid来唯一标识文件上传。Guid是一个...

    asp.net中文件的上传下载,删除

    首先,我们来了解一下ASP.NET文件上传的基本流程。在ASP.NET中,用户通过表单上传文件时,通常会使用`&lt;input type="file"&gt;`标签。当用户选择一个文件并提交表单后,服务器端的代码(通常是C#或VB.NET)会接收到`...

    asp.net ajax 多文件上传

    ASP.NET AJAX 多文件上传是一种在Web应用中实现高效、用户友好的文件上传方式,它结合了ASP.NET技术和AJAX(Asynchronous JavaScript and XML)的优势,提供了异步上传功能,使得用户无需等待整个页面刷新就能完成...

    ASP.NET通过HTML的上传文件标签来上传文件

    在ASP.NET中处理文件上传是常见的需求,尤其是在用户需要提交图片、文档或其他数据文件时。这篇博客文章“ASP.NET通过HTML的上传文件标签来上传文件”将引导我们了解如何在ASP.NET环境中实现文件上传功能。 首先,...

    基于ASP.NET文件上传、下载的网络硬盘系统 源码

    【ASP.NET文件上传与下载系统】是一个典型的Web应用程序,它允许用户通过网络进行文件的上传和下载操作。这个系统基于微软的ASP.NET框架构建,利用了ASP.NET的强大功能和高效性能,为用户提供了一种安全、便捷的方式...

    ASP.NET Web API 接收文件上传

    在ASP.NET Web API中处理文件上传是常见的需求,特别是当你需要允许用户通过Web界面提交文件时。本文将深入探讨如何在ASP.NET Web API中实现文件上传功能,并涉及MIME多部分类型。 首先,让我们了解MIME...

    asp.net 超大文件上传,带进度条源码,亲测能用

    标题中提到的"asp.net 超大文件上传,带进度条源码",主要涉及以下知识点: 1. **文件分块上传**:由于单个文件可能超过ASP.NET允许的最大大小,所以通常会将大文件分割成多个小块(chunks)进行上传。每个块作为一...

    ASP.NET WebAPI 实现文件上传下载缩略图访问

    在ASP.NET WebAPI中,文件上传通常通过HttpPostedFileBase对象来处理。开发者需要创建一个API控制器方法,接受Multipart/form-data类型的请求。使用Request对象的GetInputStream()方法读取流,并将其保存到服务器的...

    ASP.NET大文件上传和下载小项目

    在“ASP.NET大文件上传和下载小项目”中,我们重点关注的是如何处理大文件的上传和下载,以及涉及到的几个关键组件和技术。 1. **大文件上传**:在传统的HTTP协议中,文件上传通常受到浏览器和服务器的限制,对文件...

    基于ASP.net的企业文件管理系统源码.zip

    2. **文件上传与下载**:使用ASP.NET的HttpPostedFileBase类处理文件上传,同时通过HTTP响应流提供文件下载。 3. **文件存储**:文件可能存储在服务器的文件系统、数据库(BLOB存储)或云存储服务(如Azure Blob ...

    Asp.Net WebApi 上传文件方法(原生js上传和JQ ajax上传)

    在Asp.Net WebApi框架中,开发Web服务接口来处理文件上传是一项常见的任务。本教程将探讨两种不同的客户端上传方式:原生JavaScript和jQuery AJAX。这两种方法都可以与Asp.Net WebApi结合,实现用户友好的文件上传...

    asp.net上传、读出、删除文件

    在ASP.NET中,文件上传主要依赖于`&lt;asp:FileUpload&gt;`控件。首先,在网页的HTML部分添加此控件,然后在服务器端处理文件上传。以下是一个简单的示例: ```html &lt;asp:FileUpload ID="FileUpload1" runat="server" /&gt; ...

    asp.net+flash批量上传

    asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件...

    基于asp.net 的文件上传和下载

    在ASP.NET框架中,文件上传和下载是常见的Web应用程序功能,尤其对于数据交换、资源分享和用户交互至关重要。本文将深入探讨如何利用ASP.NET实现文件的上传与下载,旨在为开发者提供详尽的实践指导。 一、文件上传 ...

    asp.net文件上传下载程序 有数据库 下载可用

    ASP.NET文件上传下载程序是一个基于微软的ASP.NET技术构建的应用,用于实现用户在Web端上传和下载文件。这种程序通常包含后端服务器处理逻辑和前端用户界面,与数据库结合以存储文件元数据,如文件名、大小、上传...

Global site tag (gtag.js) - Google Analytics