`
javatoyou
  • 浏览: 1016550 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ASP.NET中文件上传下载方法集合(上传限制,保存方式-二进制或文件形式,上传Internet上的资源 )

 
阅读更多

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

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

  这样上传文件的最大值就变成了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()
 {}
 /**////
 /// 上传文件名称
 ///
 public string FileName
 {
  get
  {
   return fileName;
  }
  set
  {
   fileName = value;
  }
 }
 private string fileName;

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

 /**////
 /// 文件扩展名
 ///
 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
{
 /**////
 /// 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文件上传下载方法集合

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

    ASP.NET中上传下载

    ASP.NET中文件上传下载方法集合 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:  1、如何解决文件上传大小的限制  2、以文件形式保存到服务器 ...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    asp.net技术内幕(1)

    4.3.3 使用HTMLInputFile控件接受文件上传 4.4 小结 <br>第二部分 高级ASP.NET页面开发 <br>第5章 用用户控件创建自定义控件 <br>5.1 用用户控件包含标准内容 5.2 显露用户控件中的属性和...

    ASP.net技术内幕

    内容包括:ASP.NET Web表单的使用,高级ASP.NET页面的开发,ADO.NET的使用,ASP.NET应用程序的使用, ASP.NET应用程序的保护,ASP.NET Web服务的建立,.NET框架的利用,自定义的ASP.NET控件的建立,ASP.NET的应用...

    asp.net技术内幕(5)

    4.3.3 使用HTMLInputFile控件接受文件上传 4.4 小结 <br>第二部分 高级ASP.NET页面开发 <br>第5章 用用户控件创建自定义控件 <br>5.1 用用户控件包含标准内容 5.2 显露用户控件中的属性和...

    asp.net技术内幕(4)

    4.3.3 使用HTMLInputFile控件接受文件上传 4.4 小结 <br>第二部分 高级ASP.NET页面开发 <br>第5章 用用户控件创建自定义控件 <br>5.1 用用户控件包含标准内容 5.2 显露用户控件中的属性和...

    asp.net技术内幕(3)

    4.3.3 使用HTMLInputFile控件接受文件上传 4.4 小结 <br>第二部分 高级ASP.NET页面开发 <br>第5章 用用户控件创建自定义控件 <br>5.1 用用户控件包含标准内容 5.2 显露用户控件中的属性和...

    asp.net技术内幕(2)

    4.3.3 使用HTMLInputFile控件接受文件上传 4.4 小结 <br>第二部分 高级ASP.NET页面开发 <br>第5章 用用户控件创建自定义控件 <br>5.1 用用户控件包含标准内容 5.2 显露用户控件中的属性和...

    亮剑.NET深入体验与实战精要2

    9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络...

    亮剑.NET深入体验与实战精要3

    9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络...

    网管教程 从入门到精通软件篇.txt

    BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 BUN:CakeWalk 声音...

    C#微软培训资料

    17.1 .Net 框架结构提供的 I/O 方式 .215 17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码...

Global site tag (gtag.js) - Google Analytics