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

开发 后端
本文总结了在ASP.NET中一些文件上传下载的方法。ASP.NET中的文件上传下载是我们经常要用到的技术。

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

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

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

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

4、上传Internet上的资源

ASP.NET中文件上传下载,***部分:

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

这样上传文件的***值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为asp.net会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为asp.net 建立的pipe里分块读取数据。实现方法如下:

  1. IServiceProvidERProvider=(IServiceProvider)HttpContext.Current;   
  2. HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));   
  3. byte[]bs=wr.GetPreloadedEntityBody();   
  4. .   
  5. if(!wr.IsEntireEntityBodyIsPreloaded())   
  6. {   
  7.  intn=1024;   
  8.  byte[]bs2=newbyte[n];   
  9.  while(wr.ReadEntityBody(bs2,n)>0)   
  10.  {   
  11.   ..   
  12.  }   
  13. }  
  14.  

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

ASP.NET中文件上传下载,第二部分:

下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。

首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。

  1. public class FileUpLoad   
  2. {   
  3.  public FileUpLoad()   
  4.  {}   
  5.  /**////   
  6.  /// 上传文件名称   
  7.  ///   
  8.  public string FileName   
  9.  {   
  10.   get   
  11.   {   
  12.    return fileName;   
  13.   }   
  14.   set   
  15.   {   
  16.    fileName = value;   
  17.   }   
  18.  }   
  19.  private string fileName;   
  20.  /**////   
  21.  /// 上传文件路径   
  22.  ///   
  23.  public string FilePath   
  24.  {   
  25.   get   
  26.   {   
  27.    return filepath;   
  28.   }   
  29.   set   
  30.   {   
  31.    filepath = value;   
  32.   }   
  33.  }   
  34.  private string filepath;   
  35.  /**////   
  36.  /// 文件扩展名   
  37.  ///   
  38.  public string FileExtension   
  39.  {   
  40.   get   
  41.   {   
  42.    return fileExtension;   
  43.   }   
  44.   set   
  45.   {   
  46.    fileExtension = value;   
  47.   }   
  48.  }   
  49.  private string fileExtension;   
  50. }  
  51.  

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

  1. <?XML version="1.0" encoding="gb2312" ?>   
  2. <Application>   
  3. <FileUpLoad>  
  4. <Format>.jpg|.gif|.png|.bmp   
  5. </FileUpLoad>   
  6. </Application> 

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

  1. public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)   
  2. {   
  3.  FileUpLoad fp = new FileUpLoad();   
  4.  string fileName,fileExtension;   
  5.  string saveName;   
  6.  //   
  7.  //建立上传对象   
  8.  //   
  9.  HttpPostedFile postedFile = InputFile.PostedFile;   
  10.  fileName = System.IO.Path.GetFileName(postedFile.FileName);   
  11.  fileExtension = System.IO.Path.GetExtension(fileName);   
  12.  //   
  13.  //根据类型确定文件格式   
  14.  //   
  15.  AppConfig app = new AppConfig();   
  16.  string format = app.GetPath("FileUpLoad/Format");   
  17.  //   
  18.  //如果格式都不符合则返回   
  19.  //   
  20.  if(format.IndexOf(fileExtension)==-1)   
  21.  {   
  22.   throw new ApplicationException("上传数据格式不合法");   
  23.  }   
  24.  //   
  25.  //根据日期和随机数生成随机的文件名   
  26.  //   
  27.  if(myfileName != string.Empty)   
  28.  {   
  29.   fileName = myfileName;   
  30.  }   
  31.  if(isRandom)   
  32.  {   
  33.   Random objRand = new Random();   
  34.   System.DateTime date = DateTime.Now;   
  35.   //生成随机文件名   
  36.   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);   
  37.   fileName = saveName + fileExtension;   
  38.  }   
  39.  string phyPath = HttpContext.Current.Request.MapPath(filePath);   
  40.  //判断路径是否存在,若不存在则创建路径   
  41.  DirectoryInfo upDir = new DirectoryInfo(phyPath);   
  42.  if(!upDir.Exists)   
  43.  {   
  44.   upDir.Create();   
  45.  }   
  46.  //   
  47.  //保存文件   
  48.  //   
  49.  try   
  50.  {   
  51.   postedFile.SaveAs(phyPath + fileName);   
  52.   fp.FilePath = filePath + fileName;   
  53.   fp.FileExtension = fileExtension;   
  54.   fp.FileName = fileName;   
  55.  }   
  56.  catch   
  57.  {   
  58.   throw new ApplicationException("上传失败!");   
  59.  }   
  60.  //返回上传文件的信息   
  61.  return fp;   
  62. }  
  63.  

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

ASP.NET中文件上传下载,第三部分:

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

  1. public byte[] UpLoadFile(HtmlInputFile f_IFile)   
  2. {   
  3.  //获取由客户端指定的上传文件的访问   
  4.  HttpPostedFile upFile=f_IFile.PostedFile;   
  5.  //得到上传文件的长度   
  6.  int upFileLength=upFile.ContentLength;   
  7.  //得到上传文件的客户端MIME类型   
  8.  string contentType = upFile.ContentType;   
  9.  byte[] FileArray=new Byte[upFileLength];  
  10.  
  11.  Stream fileStream=upFile.InputStream;  
  12.  
  13.  fileStream.Read(FileArray,0,upFileLength);   
  14.  return FileArray;   
  15. }  
  16.  

这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个 aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:

首先,在Web.config中加入:

  1. <add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>  
  2.  

这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:

  1. using System;   
  2. using System.Data;   
  3. using System.Web;   
  4. using System.IO;   
  5. using Ruixin.WorkFlowDB;   
  6. using RXSuite.Base;   
  7. using RXSuite.Component;   
  8. using RuixinOA.BusinessFacade;   
  9. namespace RuixinOA.Web.BaseClass   
  10. {   
  11.  /**////   
  12.  /// NetUFile 的摘要说明。   
  13.  ///   
  14.  public class OpenFile : IHttpHandler   
  15.  {   
  16.   public void ProcessRequest(HttpContext context)   
  17.   {   
  18.    //从数据库中取出要下载的文件信息   
  19.    RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();   
  20.    EntityData data = os.GetFileDetail(id);   
  21.    if(data != null && data.Tables["RX_OA_File"].Rows.Count >0)   
  22.    {   
  23.     DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];   
  24.     context.Response.Buffer = true;   
  25.     context.Response.Clear();   
  26.     context.Response.ContentType = dr["CContentType"].ToString();   
  27.     context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));   
  28.     context.Response.BinaryWrite((Byte[])dr["CContent"]);   
  29.     context.Response.Flush();   
  30.     context.Response.End();   
  31.    }   
  32.   }   
  33.   public bool IsReusable   
  34.   {     
  35.    get { return true;}   
  36.   }   
  37.  }   
  38. }  
  39.  

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

ASP.NET中文件上传下载,第四部分:

这一部分主要说如何上传一个Internet上的资源到服务器。

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

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

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

【编辑推荐】

  1. ASP.NET表单身份验证的实现方法
  2. JQuery Form Ajax提交asp.net表单时失败
  3. ASP.NET安装部署问题总结
  4. 在APACHE上运行ASP.NET经验总结
  5. ASP.NET在线学习资源总汇

     

责任编辑:book05 来源: cnblogs
相关推荐

2023-09-06 08:33:30

2009-07-03 14:15:54

JSP SmartUp

2009-07-07 13:45:04

jspsmart

2009-10-30 14:03:59

ASP.NET上传文件

2024-05-20 13:06:18

2009-07-20 16:09:39

2018-04-20 16:15:42

Koa2上传下载

2015-02-11 16:34:49

微信SDK

2009-07-21 15:38:31

2010-03-08 11:34:45

Linux上传下载指令

2009-07-21 16:23:57

2009-07-29 10:02:49

ASP.NET上传

2009-07-24 15:07:56

ASP.NET上传文件

2009-07-21 13:01:07

ASP.NET上传文件

2009-07-27 17:32:39

Web ServiceASP.NET

2010-02-05 08:32:32

ASP.NET MVC

2009-07-20 18:06:26

ASP.NET限制上传

2009-09-01 16:49:56

C#文件上传下载

2021-06-04 13:07:53

LinuxPythonXshell

2009-07-31 11:45:42

ASP.NET文件下载
点赞
收藏

51CTO技术栈公众号