.NEt专家博客!

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

上一篇 / 下一篇  2009-01-20 17:04:45 / 个人分类:WEB开发

文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:ITPUB个人空间'Pv+ub@+\tz

2n/_ K_Lo@,Kf0  1、如何解决文件上传大小的限制ITPUB个人空间^,U Ok2?(g m
ITPUB个人空间.U5v"K tMQ]0[ X o"rS$z
  2、以文件形式保存到服务器
\9[(nra"b`Bl0
Vu+W.bu$X"q9IO_f0  3、转换成二进制字节流保存到数据库以及下载方法
5oQ/vd Pv/pp2T0
;lA-V5q{;D%a0  4、上传Internet上的资源
?j~^ eK%Z0
XH-w og]q1KV&fb0  第一部分:ITPUB个人空间`2bR3NqTeDtTJ

\6{k!|!Fi4Ys0  首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下:
|0I#E1]h#N kh0
]-h&Z e6uyqs0  这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下:ITPUB个人空间*ZJ Xg2{2c a Ip t

vA:N;n"B6t0IServiceProvidERProvider=(IServiceProvider)HttpContext.Current;ITPUB个人空间1k I+kV;kU(k
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
IGhJ"RT.w.j0byte[]bs=wr.GetPreloadedEntityBody();ITPUB个人空间em'`X7_
.
TJBf7p6@s0if(!wr.IsEntireEntityBodyIsPreloaded())ITPUB个人空间;}vx&s1v
{
%`b@ hk G&L0  intn=1024;
/c|l${h&K0s0  byte[]bs2=newbyte[n];ITPUB个人空间U'X L/sv$q
  while(wr.ReadEntityBody(bs2,n)>0)
H%ZZ E1| hO%p0  {ITPUB个人空间-QtL*Km k)]4N(F
  ..
4oY1^vl v2Z1u3x0  }
XC6R9_%FKA0}ITPUB个人空间*P&X0tV[;pI*\F B

"UAJ7a/Y0  这样就可以解决了大文件的上传问题了。
JS*u+BC;t~0
8OQ6yr2jzcl~0  第二部分:ITPUB个人空间\b!bE R:Ww
ITPUB个人空间E+} \giO&V!s
  下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。ITPUB个人空间T,u-[:Ah}:d7urG
ITPUB个人空间+^^ F%FXRO
  首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。
qg0|-KhJO&S0
`:H1J`9w!m)^0N0public class FileUpLoad
P]}+pW0{
9CgY$r.I.B0  public FileUpLoad()
9l:| T`4^[(D0  {}ITPUB个人空间*^u*ur8I9k4J1SDO.g
  /**////
@ g b(WT^5Fy0  /// 上传文件名称ITPUB个人空间f0fv/jY
  ///ITPUB个人空间^RI2u7\"cD3`
  public string FileName
0Syc~;E W^"VkB0  {
7e2^J%l B\0  getITPUB个人空间:K2c4N w0Wx!vY
  {
9Ta0f5f+N u m0  return fileName;ITPUB个人空间.Hb#J&nX8_JO
  }
O2hgX G9J cG T0  setITPUB个人空间2]9F'@#G"Sk;ao
  {
+\OK'P.p1I/m:g FT _0  fileName = value;
XbiIy-@JOUF0  }ITPUB个人空间)el ^K"wk
  }
[/L| f#Ve*gdS0  private string fileName;ITPUB个人空间3i8t}UDY:_e8b
ITPUB个人空间gtf"~*vHk7j-dJ0p
  /**////ITPUB个人空间3{.J*Vpa$`?
  /// 上传文件路径ITPUB个人空间H tS+k A7K Vl
  ///
}X/`~2`)G9E8_1t0  public string FilePathITPUB个人空间n5[mu YJ*nRC o
  {
&C.PGo Ii p'E^0  get
;|:f%@of!Oo_O(Mrl0  {
E6g:k0O:IG0  return filepath;
9Aw8q/]qL!U0  }
;V`pic;uu"_/c0  setITPUB个人空间R7N~)QlJ5}
  {ITPUB个人空间#L7[oZ^
  filepath = value;ITPUB个人空间Yf)Mh%z!i
  }ITPUB个人空间^d-h{ MG
  }ITPUB个人空间1L9A$H-Hp6Xp;n
  private string filepath;
:}E azxM0ITPUB个人空间6P$eQ RHZ
  /**////
bI)B S1U-F L0  /// 文件扩展名ITPUB个人空间2Kp-F4|:u;?C
  ///
8ZR*F5ykO0  public string FileExtensionITPUB个人空间|'uLo4`ktY
  {ITPUB个人空间5W F ]][ m6QI
  getITPUB个人空间;pC\1C:_ n#yt
  {
eL ceK oi[0  return fileExtension;ITPUB个人空间vl2\^9V.w
  }ITPUB个人空间"bedm ^1]R
  set
r-J7f+GR?0  {
-r2B+k's5x4~5w0  fileExtension = value;ITPUB个人空间lG~*m"U
  }
R6G| U5Y4A&]J h0  }
%MO T9iyMo C0  private string fileExtension;
nIj1r9p}0}ITPUB个人空间 f2u P S#E
ITPUB个人空间L"yrX:l
  另外我们还可以在配置文件中限制上传文件的格式(App.Config):ITPUB个人空间Tu!U qKAv,X:XP$]O
<?XML version="1.0" encoding="gb2312" ?>
%U9U[!MoP zkE3c0<Application>ITPUB个人空间1N,g4a]U0d
<FileUpLoad>
NaOsiQ5Y0<Format>.jpg|.gif|.png|.bmpITPUB个人空间Q b S-Gp\9m
</FileUpLoad>ITPUB个人空间_+Z*Us!k K S _
</Application>ITPUB个人空间 v:p O^k
ITPUB个人空间l z.dl*~_.R
  这样我们就可以开始写我们的上传文件的方法了,如下:ITPUB个人空间]l.Y#F4y.o w

4?0qsjM S0public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)ITPUB个人空间| v~.v9m ` gieXrr
{
.ut4MEg)r0  FileUpLoad fp = new FileUpLoad();
P%cq`Fp{v^0  string fileName,fileExtension;ITPUB个人空间2W+FH|J&?
  string saveName;ITPUB个人空间b0[Zb+p,s3n
ITPUB个人空间i/y0yrL@
  //ITPUB个人空间,~!sQih/G,\e;_y2g
  //建立上传对象ITPUB个人空间[RIqI*\5@
  //
$? f |kgWbW$M`0  HttpPostedFile postedFile = InputFile.PostedFile;ITPUB个人空间k2zves"og7t%W"z
ITPUB个人空间,vm?+rG2r&vXl
  fileName = System.IO.Path.GetFileName(postedFile.FileName);
b]$\4h R-?9}7l7H d0  fileExtension = System.IO.Path.GetExtension(fileName);ITPUB个人空间2P/JnyQZZF8G.m

m9Y$~ v~~t-|f0  //ITPUB个人空间B#jWa|4let0p
  //根据类型确定文件格式ITPUB个人空间P&n4A }9Z;u0D&m0Q
  //ITPUB个人空间"X6T;u{(B};j&v@
  AppConfig app = new AppConfig();ITPUB个人空间$X;p%yT1lo~
  string format = app.GetPath("FileUpLoad/Format");ITPUB个人空间;N5w[-uz9cqO
ITPUB个人空间j-} E"r1IA L \
  //
0}'l(Q F U.hU0  //如果格式都不符合则返回ITPUB个人空间7C YD_H*rWZR n7^?
  //
8U i0YH5O5c2b*o0  if(format.IndexOf(fileExtension)==-1)
?zy&B*^/szS0  {
]GRfl0  throw new ApplicationException("上传数据格式不合法");ITPUB个人空间tW9YVp#V2mV2Cf
  }ITPUB个人空间&n-fC-E&w {e
ITPUB个人空间8y/O } ~[6f.i9asw
  //ITPUB个人空间O6H_'~}guAq@
  //根据日期和随机数生成随机的文件名
Yx%E$q/Vq'l_G0  //
f"K*~S0jt@0  if(myfileName != string.Empty)
DXg"c&QfRHU0  {ITPUB个人空间#]\,y6Ibx
  fileName = myfileName;ITPUB个人空间,i D4e |s*P6~We1[
  }
&Bg Lr0s+Q3Nxvq0
3@Wp2A8@qfD0  if(isRandom)ITPUB个人空间-I Hje.y
  {
%@y3\%e.Lf-K pb$P0  Random bjRand = new Random();ITPUB个人空间c7bC [u {
  System.DateTime date = DateTime.Now;ITPUB个人空间 k~:f @6o?'f
  //生成随机文件名ITPUB个人空间;S#N7I6^#SpY
  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);ITPUB个人空间NBjDH,F5G7l#x
  fileName = saveName + fileExtension;ITPUB个人空间5o!q7`N+?1u6_z
  }ITPUB个人空间*WZ|$jzC

u jz.o;g0  string phyPath = HttpContext.Current.Request.MapPath(filePath);ITPUB个人空间ol;A,e.M8dJ|s
ITPUB个人空间\M$uMn'H
  //判断路径是否存在,若不存在则创建路径
{L7|i(pHv^0  DirectoryInfo upDir = new DirectoryInfo(phyPath);
+QV'n!B[5t0  if(!upDir.Exists)
:],}(|g4|bc-^OU0  {
v!s}@ h5B*w0  upDir.Create();
y \ui P N$F4ka0  }ITPUB个人空间-z,WG FyY-J

#uVsu)K0  //
^K/R p4X'jh0  //保存文件ITPUB个人空间,Z2o y1i?5U"x
  //
A"v n s3{*f0  try
:q y;yjq@2al0  {ITPUB个人空间'b2i)Y0iXA+{@ ORq*tW
  postedFile.SaveAs(phyPath + fileName);
2Uc-seQZQ0
5FU1Zo/@X0  fp.FilePath = filePath + fileName;
I%od2Yhylu~0  fp.FileExtension = fileExtension;ITPUB个人空间6kq k S_$wA ^?n
  fp.FileName = fileName;ITPUB个人空间5]s2R/@4R9LX7]
  }ITPUB个人空间6|Br x E`"}6@_y
  catch
8?#{'f)I3b }0  {ITPUB个人空间X H*v&Vd8_9p
  throw new ApplicationException("上传失败!");ITPUB个人空间h%F|'W6c#}S.i
  }
b.Q.O+BQ}w-Y0
.W5?'A^-Se0  //返回上传文件的信息ITPUB个人空间V*s2Sp p-]z ~
  return fp;
~LJYQuS0}ITPUB个人空间i*n?"?)^7`7m']0b
ITPUB个人空间MYW![4w z.NdG
  然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。ITPUB个人空间h-p-q%wxd*V
ITPUB个人空间V C s'ApZ
  第三部分:ITPUB个人空间v MFl7XK7T.dj

\6]+n.]@ [ ?:e;f0  这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:
em)~Q2i3G4l0
)t E]$DN0public byte[] UpLoadFile(HtmlInputFile f_IFile)
q%X#]"],K l*ao0{ITPUB个人空间(^R2\`h^-e&j o
  //获取由客户端指定的上传文件的访问
1^*N0uP2C m(J0c u0  HttpPostedFile upFile=f_IFile.PostedFile;ITPUB个人空间@ W x,iL
  //得到上传文件的长度ITPUB个人空间? qE K/e
  int upFileLength=upFile.ContentLength;ITPUB个人空间"n? ]8p AOp
  //得到上传文件的客户端MIME类型
b$R9C2Ui#A,fo0  string contentType = upFile.ContentType;
TXZ b _Bx H E6}+n0  byte[] FileArray=new Byte[upFileLength];
k&{]6J8X |%R|2l0ITPUB个人空间 |:z iD$iY\M
  Stream fileStream=upFile.InputStream;
1h/Va-p+za:h0
b\2y&MR"t0  fileStream.Read(FileArray,0,upFileLength);
Eq-~N'C2Z0  return FileArray;ITPUB个人空间0vSl{(n9VhN
}ITPUB个人空间0`9@p?dS7C

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

}KWq8u]$y{0  首先,在Web.config中加入:ITPUB个人空间Sg9PY0q9FSl

:wv([ c-A$z0<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
s+d{0Y9T x A0Pf.nv4F0
OH.D4P#@pO(tp0  这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:
)t` g%\3rn0
dK O/@7}$D"`!m3R wZ0using System;ITPUB个人空间 JB$xoEZh w
using System.Data;
i;n `k d R0using System.Web;ITPUB个人空间Hbd;eS9^
using System.IO;
I6y^4]K:R1@0using Ruixin.WorkFlowDB;ITPUB个人空间[mEk0W2Q_"r Z,f-^+Y
using RXSuite.Base;
;rUO@2vu\;h0using RXSuite.Component;
[px2iAQ0using RuixinOA.BusinessFacade;
1^ |U,}-P[8M9g`0
:c3WhOsUYz&n0namespace RuixinOA.Web.BaseClass
;p$p0Z+F ~KLq0o9h |I0{
)P3q,v"F$W0  /**////
R8ln Na0  /// NetUFile 的摘要说明。
6^8}#b)lhc0Wa#SYf0  ///ITPUB个人空间IRf,F[Z
  public class OpenFile : IHttpHandlerITPUB个人空间 D!BP$Uf1]
  {
,k,Hi9?N0  public void ProcessRequest(HttpContext context)
Xa^$zh2R@5?/c.D0  {ITPUB个人空间y,?V_a0g
  //从数据库中取出要下载的文件信息ITPUB个人空间BX+F\V"r^
  RuixinOA.BusinessFacade.RX_OA_FileManager s = new RX_OA_FileManager();ITPUB个人空间V/H Vb:v8V!k.`O.G
  EntityData data = os.GetFileDetail(id);
D+yOV3dg-[CCf0
D8mo,T1?R0  if(data != null && data.Tables["RX_OA_File"].Rows.Count >0)
hi.c-Jt0  {ITPUB个人空间mL[ k\N*I
  DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
0S+p9b_4a0CA0  context.Response.Buffer = true;ITPUB个人空间R^/`(o2]l0[
  context.Response.Clear();ITPUB个人空间&v b:`6@ k%t1v{E1_
  context.Response.ContentType = dr["CContentType"].ToString();
6OJpD9v.v0  context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
/z\;P3V;\0  context.Response.BinaryWrite((Byte[])dr["CContent"]);
ng!t,KK%L0  context.Response.Flush();ITPUB个人空间"U` [L5F6`
  context.Response.End();ITPUB个人空间`]vP [m(B
  }ITPUB个人空间 q a:yY$q
  }ITPUB个人空间,@:J QS,v|r
  public bool IsReusable
DK[MK!b)fY-?0  {  ITPUB个人空间3M;qD#?Vv(~aB%bZ1R
  get { return true;}ITPUB个人空间D ~9y/JOla
  }
tg'z%G9hM1@0  }ITPUB个人空间!r*\;VS2{B
}
{rtJ2Y }`U0ITPUB个人空间"M;] Nw0U.y u)?
  执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。ITPUB个人空间n\(mrUA'{h/}6^
ITPUB个人空间'w*jk3E*s7S1?S `
  第四部分:ITPUB个人空间e Mnhu^J
ITPUB个人空间2N+Yk6Av
  这一部分主要说如何上传一个Internet上的资源到服务器。ITPUB个人空间P!`-R'O[h&?
ITPUB个人空间+d1F kH&Q!h cR
  首先需要引用 System.Net 这个命名空间,然后操作如下:ITPUB个人空间 Rn2y CRYW
ITPUB个人空间;QkqAUl
HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
!t.\,V(s/A9x_0HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse();ITPUB个人空间h5N3DH(An.N/^6V
byte[] bytes = new byte[hwr.ContentLength];
R{o$sP,bw0Stream stream = hwr.GetResponseStream();ITPUB个人空间h u.C4S N jX}
stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));
x BvUk#tz0//HttpContext.Current.Response.BinaryWrite(bytes);
;fk{:Xs0
c&q2IpGen0  HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。

TAG: 微软

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2012-02-09  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665446
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar