`
cpsing
  • 浏览: 73087 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多
文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:

  1、如何解决文件上传大小的限制

  2、以文件形式保存到服务器

  3、转换成二进制字节流保存到数据库以及下载方法

  4、上传Internet上的资源

  第一部分:

  首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下:

  <httpruntime usefullyqualifiedredirecturl="false" maxrequestlength="40960" executiontimeout="300"></httpruntime>这样上传文件的最大值就变成了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
</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></summary>
 /// NetUFile 的摘要说明。
 ///
 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上的资源到服务器。

  首先需要引用 System.Net 这个命名空间,然后操作如下:

HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse();
byte[] bytes = new byte[hwr.ContentLength];
Stream stream = hwr.GetResponseStream();
stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));
//HttpContext.Current.Response.BinaryWrite(bytes);

  HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。

  第五部分:总结

  今天简单的介绍了几种文件上传与下载的方法,都是在实际的项目开发中经常需要用到的,可能还有不完善的地方,希望大家可以互相交流一下项目开发中的经验 



分享到:
评论

相关推荐

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

    ### ASP.NET中文件上传下载方法集合 #### 一、解决文件上传大小的限制 在ASP.NET中,默认的文件上传大小限制为2MB,这在处理大型文件上传时可能显得不足。为了解决这一限制,可以通过修改`Web.Config`文件自定义...

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

    在 ASP.NET 中,文件上传下载是常见的需求,尤其是在构建交互式网站或应用程序时。以下是一些关于 ASP.NET 中文件上传下载的关键知识点: 1. **文件上传大小限制**:默认情况下,ASP.NET 允许的最大上传文件大小为 ...

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

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

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

    ASP.NET 文件上传下载方法集合涵盖了在开发Web应用时处理文件上传和下载的常见技术。以下是对这些知识点的详细说明: 1. **解决文件上传大小限制**:默认情况下,ASP.NET允许的最大文件上传大小为2MB。为了增大这个...

    Asp.NET大文件上传开发总结集合

    在Asp.NET中进行大文件上传是一个常见的需求,但在默认情况下,Asp.NET存在上传文件大小的限制,并且无法提供上传进度。这个问题在.NET 1.1版本尤为明显,因为那时上传的文件会被完全加载到服务器内存中。然而,在...

    asp.net 多文件上传

    ASP.NET多文件上传是Web开发中的一个重要功能,它允许用户一次性上传多个文件,极大地提高了用户交互体验。在ASP.NET框架中,实现这个功能通常涉及到HTML控件、服务器端代码以及数据库存储等多个方面。以下是对这一...

    ASP.NET多文件上传

    ASP.NET多文件上传是Web开发中的一个重要功能,它允许用户一次性上传多个文件,极大地提高了用户交互性和效率。在ASP.NET框架中,实现这一功能需要掌握一些核心知识点。 首先,了解HTTP协议的基础至关重要。HTTP...

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

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

    ASP.NET中文件上传下载

    在ASP.NET中,文件上传和下载是常见的功能,尤其在处理用户交互、数据存储以及信息交换时非常关键。 文件上传允许用户将本地计算机上的文件传输到服务器上。在ASP.NET中,这一过程通常通过HTML表单和控件实现,如`...

    ASP.NET的文件上传系统

    下面我们将深入探讨ASP.NET文件上传系统的关键知识点。 1. **控件使用**:ASP.NET提供多种控件用于文件上传,最常见的是`&lt;asp:FileUpload&gt;`控件。这个控件允许用户选择要上传的文件,并将其包含在POST请求中。 2. ...

    ASP.NET Web API 接收文件上传

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

    asp.net+flex批量上传文件

    在批量文件上传场景中,ASP.NET可以处理后台的文件接收、存储和处理逻辑。 在ASP.NET中实现文件上传,主要涉及`HttpPostedFileBase`类。这个类是ASP.NET MVC或Web Forms中用于处理HTTP POST请求中上传文件的对象。...

    asp.net多文件上传源代码

    本文将基于提供的示例代码来深入分析如何在ASP.NET Web Forms应用中实现多文件上传的功能。 #### 1. HTML界面设计 首先,我们来看看前端部分是如何设计的: ```html &lt;!DOCTYPE ...

    ASP.net实现多文件上传

    在这个场景中,我们关注的是如何使用ASP.NET来实现多文件上传的功能。多文件上传在现代Web应用中非常常见,例如用户可能需要上传一组照片或者文档。与一次性多选文件自动生成多个连接的上传方式不同,这里描述的实现...

    asp.net 文件上传和下载设计代码

    在ASP.NET中,文件上传和下载是Web应用中常见的功能,尤其在用户需要交互式地交换数据时。本文将深入探讨这两个关键知识点,包括基本原理、实现步骤以及相关的最佳实践。 1. **文件上传** - **原理**:在HTML表单...

Global site tag (gtag.js) - Google Analytics