c# asp.net fileupload 转载汇总

1.     显示一个文本框控件和一个浏览按钮,使用户可以选择要上载到服务器的文件。 命名空间: System.Web.UI.WebControls 
程序集: System.Web(在 system.web.dll 中) 
实例: 
html代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="inputfile._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
        <title>无标题页</title> 
<script language="javascript" type="text/javascript"> 
// <!CDATA[ 


// ]]> 
</script> 
        <style type="text/css"> 
                .style1 
                { 
                        text-align: center; 
                } 
                #form1 
                { 
                        text-align: center; 
                } 
        </style> 
</head> 
<body> 
        <form id="form1" runat="server" method="post" enctype="multipart/form-data"> 
        <div style="position:static;"> 
                <div class="style1"> 
        演示文件上传控件 

                </div> 
        <hr style="width:80%" /> 

                <div class="style1"> 

                <asp:FileUpload ID="File1" runat="server"/> 
                <asp:Button ID="UploadBtn" runat="server" onclick="Button1_Click" Text="上传" /> 
                </div> 
        </div> 
        <asp:Label ID="Label1" runat="server" 
                Width="437px" Height="61px"></asp:Label> 
        </form> 
</body> 
</html>

后台代码:

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 

namespace inputfile 
{ 
 public partial class _Default : System.Web.UI.Page 
        { 
 protected void Page_Load(object sender, EventArgs e) 
                { 

                } 

protected void Button1_Click(object sender, EventArgs e) 
                {//获取文件信息 
 string FileName = File1.PostedFile.FileName; 
 string file_str = "文件名称:" + FileName + "<br>"; 
                        file_str="文件类型:"+File1.PostedFile.ContentType+"<br>"; 
                        file_str="文件长度:"+File1.PostedFile.ContentLength.ToString()+"KB<br>"; 
 //上传文件到服务器 
                        FileName = FileName.Substring(FileName.LastIndexOf("\\") + 1);// 取出文件名的路径(不包括文件的名称) 

string upload_file = Server.MapPath("./upload/") + FileName;//取出服务器虚拟路径,存储上传文件

                        File1.PostedFile.SaveAs(upload_file);//开始上传文件 
                        Label1.Text =file_str+ "上传文件成功"; 
                } 
        } 
}

常用属性:

(1)FileUpload1.HasFile用来检查 FileUpload是否有指定文件。

(2)HttpContext.Current.Request.MapPath("~/") 则是获取网站所在的磁盘绝对路径的,如D:\Inetpub\ServerControls\路径,之所以要这么做,是因为FileUpload控件必须指定“绝对路径”,而非相对路径,同时绝对路径也必须有写入权限。

(3)FileUpload1.SaveAs()则是将上传文件存储在磁盘的方法。

(4)FileUpload1.FileName用于获取上传文件名称。

(5)FileUpload1.PostedFile.ContentLength 用于设置或获取上传文件大小,以Byte为单位。

   (6)FileUpload1.PostedFile.ContentType 用于设置或获取上传文件的类型 

2.   //判断上传控件中是否有值
  if (FileUpimage.HasFile == false)
  {
  Response.Write("<script lanage='javascript'> alert('请指定上传的头像')</script>");
  }
  else
  {
  string fType = FileUpimage.PostedFile.ContentType;//获取图像的类型
  if (fType == "image/bmp" || fType == "image/gif" || fType == "image/pjpeg" || fType == "image/jpeg" || fType == "image/x-png")
  {
  //获取文件信息
  FileInfo file = new FileInfo(FileUpimage.PostedFile.FileName);
  ///随机数据
  Guid guid = Guid.NewGuid();
  string stamp = guid.ToString("N");
  //生成随机数
  Random aa=new Random();
  string number=aa.Next(10000).ToString();
  //原始图片保存路径
  string path = "~/Fileupimage/" + stamp + ".gif";
  //缩略图保存路径
  string spath = "~/Fileupimage/" + number + ".gif";
  try
  {
  //原始图片保存
  FileUpimage.SaveAs(Server.MapPath(path));
  //缩略图保存
  MakeThumbImage(Server.MapPath(path), Server.MapPath(spath), 200, 100);
  //给隐藏的图片控件赋值并显示
  Image1.Visible = true;
  Image1.ImageUrl = spath;
  Response.Write("<script lanage='javascript'> alert('上传成功')</script>");
  }
  catch
  {
  Response.Write("<script lanage='javascript'> alert('上传失败')</script>");
  }
  }
  else
  {
  Response.Write("<script lanage='javascript'> alert('上传头像格式不正确')</script>");
  }
  }
  }
  ///<summary>
  ///创建日期:2009-6-08
  ///创建人 :周昕
  ///方法名称:MakeThumbImage
  ///内容摘要:生成缩略图
  /// </summary>
  /// <param name="sPath">源图路径(物理路径)</param>
  /// <param name="stPath">缩略图路径(物理路径)</param>
  /// <param name="nWidth">缩略图宽度</param>
  /// <param name="nHeight">缩略图高度</param>
  private void MakeThumbImage(string sPath, string stPath, int nWidth, int nHeight)
  {
  System.Drawing.Image sImage = System.Drawing.Image.FromFile(sPath);
  int tw = nWidth;
  int th = nHeight;
  ///原始图片的宽度和高度
  int sw = sImage.Width;
  int sh = sImage.Height;
  if (sw > tw)
  {
  sw = tw;
  }
  if (sh > th)
  {
  sh = th;
  }
  System.Drawing.Bitmap objPic, objNewPic;
  objPic = new System.Drawing.Bitmap(sPath);
  objNewPic = new System.Drawing.Bitmap(objPic, sw, sh);
  objNewPic.Save(stPath);
  sImage.Dispose();
  objPic.Dispose();
  objNewPic.Dispose();
  }
}

3.  对于C#中的FileUpload解决文件上传大小限制的问题设置

您可能没意识到,但对于可以使用该技术上载的文件的大小存在限制。默认情况下,使用 FileUpload 控件上载到服务器的文件最大为 4MB 左右。不能上载超过该限制的任何内容。

然而,关于 .NET 的重要一点是,它通常会提供一种规避限制的方法。您通常可以更改正在使用的默认设置。要更改大小限制,可以在 web.config.comments 文件(可以在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 的 ASP.NET 2.0 配置文件夹中找到)或应用程序的 web.config 文件中进行一些改动。

在 web.config.comments 文件中,查找一个名为 <executionTimeout>的节点,如下所示:

<httpRuntime executionTimeout="110" maxRequestLength="4096" requestLengthDiskThreshold="80" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="5000" enableKernelOutputCache="true" enableVersionHeader="true" requireRootedSaveASPath="true" enable="true" shutdownTimeout="90" delayNotificationTimeout="5" waitChangeNotification="0" maxWaitChangeNotification="0" enableHeaderChecking="true" sendCacheControlHeader="true" apartmentThreading="false" /> 

在这个节点上进行了许多操作,但负责上载文件大小的设置是 maxRequestLength 属性。默认情况下,该属性设置为 4096 千字节 (KB)。只需更改此值,就可以增加可上载到服务器的文件大小。如果想要允许将 10 兆字节 (MB) 的文件上载到服务器,则将 maxRequestLength 值设置为 11264,这意味着该应用程序允许将最大为 11000 KB 的文件上载到服务器。

在 web.config.comments 文件中进行此改动会将该设置应用于服务器上的所有应用程序。如果要将该设置仅应用于正在使用的应用程序,则将该节点应用于应用程序的 web.config 文件,覆盖 web.config.comments 文件中的所有设置。请确保该节点位于配置文件中的 <system.web> 节点之间。

与上载文件大小限制有关的另一个设置是赋给 <httpRuntime> 节点中 executionTimeout 属性的值。

赋给 executionTimeout 属性的值是 ASP.NET 关闭前允许发生的上载秒数。如果要允许将更大的文件上载到服务器,则还要增加该值和 maxRequestLength 值。

增加可上载文件大小的一个缺点是,存在通过发出大量请求来攻击服务器的黑客。要避免这种情况,可以减小允许上载的文件大小;否则,可能会发现数百个甚至上千个 10 MB 的请求访问您的服务器。

客户端验证允许上载的文件类型

有几种方法可以用来控制上载到服务器的文件类型。遗憾的是,没有一种十全十美的方法可以防御其他人上载恶意的文件。然而,您可以采取一些步骤,以使这个允许最终用户上载文件的过程更易于管理。

一个可用的好方法是使用 ASP.NET 免费提供的 ASP.NET 验证控件。这些控件使您可以对正在上载的文件进行正则表达式检查,看看文件的扩展名是否在允许上载的扩展名之列。

因为该方法强制在客户端进行检查,所以对于允许在客户端使用验证控件的浏览器而言,这是一个理想的选择;如果签名不是您允许的签名,则该文件不能上载到服务器。清单 3 显示一个使用验证控件完成该任务的示例。

注 此处不介绍验证控件的用法。有关验证控件的完整解释以及如何在 ASP.NET 页中使用它们,请参阅 Validating ASP.NET Server Controls。

清单 3. 使用验证控件限制上载到服务器的文件类型

<ASP:FileUpload ID="FileUpload1" runat="server" /><br /> <br /><ASP:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload File" /> <br /><br /> <ASP:Label ID="Label1" runat="server"></ASP:Label> <ASP:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Only mp3, m3u or mpeg files are allowed!" ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))      +(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U){1}quot; ControlToValidate="FileUpload1"></ASP:RegularExpressionValidator> <br /><ASP:RequiredFieldValidator id="RequiredFieldValidator1" runat="server" ErrorMessage="This is a required field!" ControlToValidate="FileUpload1"></ASP:RequiredFieldValidator> 

这个简单的 ASP.NET 页使用验证控件,这样最终用户就只能将 .mp3、.mpeg 或 .m3u 文件上载到服务器。如果文件类型不是以上可选的文件类型,则 Validation 控件向屏幕抛出一个异常。如图 4 所示。

 

4.验证fileupload文件上传,使用文件头判断

   一直在想,如果文件上传的时候,稍微进行伪装。比如本来是执行文件换成.jpg的后缀名,那么客户端的验证可能就无效了。这种情况下

验证文件头就非常有必要了。

  文件头就是为了描述一个文件的一些重要的属性,它告诉了打开并处理该文件的程序这些属性

下面是百度百科

微机中的文件有很多种类型,而相同类型的文件一般还会多多少少有一些不同的地方.文件的类型有EXE,COM,BMP,GIF,WMV,APE,RMVB,FLV,SWF,TXT,CPP,ASM等等,当然有的文件根本就没有文件头,比如说TXT,不信的话可以用UltraEdit打开一个文本文件,除了这个文本文件本身的字符,你不会看到任何其他的数据.不同类型的文件,只要拓展名不同,操作系统就可以识别这个文件,并用不同的程序来打开这个文件了,比如JPEG文件,它的拓展名一般式jpg,当双击这种类型的文件时,操作系统会自动选择相应的程序来打开这个文件,比如用ACDSee打开.但值得注意的是,相同类型的文件是有不同的地方的,这回拿BMP来举例,大家可以想象一下不同的图片之间最大的不同是什么,有人可能会说是内容,我可以告诉你,你想歪了!不知道大家有没有在看到各种不同大小的图像的时候想过图像浏览软件是怎样识别图像的大小的?这其实就是文件头的功劳!下面给大家演示一下: 

  先用Windows自带的画图软件创建一个64*64像素的16位纯白BMP图像,保存为1.bmp 

  然后将图像的大小改为128*64,另存为2.bmp 

  在ACDSee的浏览界面看到如图的两个东西 

  再用UltraEdit同时打开这两个文件,看看这两个文件的前32个字节: 

  1.bmp: 

  00000000h: 42 4D 76 08 00 00 00 00 00 00 76 00 00 00 28 00 ; BMv.......v...(. 

  00000010h: 00 00 40 00 00 00 40 00 00 00 01 00 04 00 00 00 ; ..@...@......... 

  2.bmp: 

  00000000h: 42 4D 76 10 00 00 00 00 00 00 76 00 00 00 28 00 ; BMv.......v...(. 

  00000010h: 00 00 80 00 00 00 40 00 00 00 01 00 04 00 00 00 ; ..?..@......... 

  由于这是十六进制的数据,所以要将原来图像的宽度和高度换成十六进制,以便找到我们想要看到的数据 

  十进制的128等于十六进制的80,十进制的64等于十六进制的40.这样在第二行好像有我们找的数据 

  这个过程只是为了让大家了解一下文件头,其实这些数据都是有标准的,百度百科的BMP词条就有BMP文件的文件结构 

  LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)[2]

  LONG biHeight; // 位图的高度,以像素为单位(22-25字节)

  18-21字节的数据是80 00 00 00,这是个双字,其实就是80,内存中的数据就是这么放的,这个不是问题 

 例如EXE在维基百科介绍的文件头

EXE是在OS/2、MS-DOS和Windows系统中通用的可执行文件的扩展名,包括以下几种主要的文件格式:

DOS可执行文件:最简单的可执行文件格式,可以在DOS和WINDOWS中运行。它通过在文件头添加ASCII字符串“MZ”(16进制中表示为4D5A)来标识。“MZ”是MS-DOS开发者之一的马克·茨柏克沃斯基(Mark Zbikowski)的姓名首字母缩写。

16位元新可执行文件:通过在文件头添加ASCII字符串“NE”来标识。它只能运行在Windows和OS/2系统,而不能在DOS下运行。

16/32位元混合式线性可执行文件:通过在文件头添加ASCII字符串“LE”来标识。它仅用来在Windows 3.x和Windows 9x中替代VxD驱动。

32位元线性可执行文件:通过在文件头添加ASCII字符串“LX”来标识。运行在OS/2 2.0以及更高版本中,也可用于某些DOS扩展。

32位元可执行文件:这是最复杂也是目前最流行的可执行文件格式,通过在文件头添加ASCII字符串“PE”来标识。它主要运行于Windows 95和Windows NT以及更高版本的Windows中,也可在BeOS R3中运行。

64位元可执行文件:与前一种类似,但使用支持64位元的中央处理器。因此它仅能在64位元的Windows系统中运行,譬如Windows XP 64-Bit Edition 和 Windows Server 2003 64-Bit Edition。

 

  .net判断文件头

           System.IO.FileStream  fs=new System.IO.FileStream(sFileName,System.IO.FileMode.Open,System.IO.FileAccess.Read);
                System.IO.BinaryReader r=new System.IO.BinaryReader(fs);
                string filetype="";//定义个空的字符串
                byte buffer;//定义一个字节变量

                try
                {
                    buffer=r.ReadByte();//读取第一个字节
                    filetype=buffer.ToString();//将二进制文件流的第一个字节转成字符串
                    buffer=r.ReadByte(); //继续读取第二个字节
                    filetype+=buffer.ToString();//将读取到的两个前两个字节tostring。即可得到我们需要的
                }
                catch (Exception exc)
                {
                    Console.WriteLine(exc.Message);
                }
                r.Close();
                fs.Close();

 

  
JPEG (jpg),文件头:FFD8FF  
PNG (png),文件头:89504E47  
GIF (gif),文件头:47494638  
TIFF (tif),文件头:49492A00  
Windows Bitmap (bmp),文件头:424D  
CAD (dwg),文件头:41433130  
Adobe Photoshop (psd),文件头:38425053  
Rich Text Format (rtf),文件头:7B5C727466  
XML (xml),文件头:3C3F786D6C  
HTML (html),文件头:68746D6C3E  
Email [thorough only] (eml),文件头:44656C69766572792D646174653A  
Outlook Express (dbx),文件头:CFAD12FEC5FD746F  
Outlook (pst),文件头:2142444E  
MS Word/Excel (xls.or.doc),文件头:D0CF11E0  
MS Access (mdb),文件头:5374616E64617264204A  
WordPerfect (wpd),文件头:FF575043  
Postscript (eps.or.ps),文件头:252150532D41646F6265  
Adobe Acrobat (pdf),文件头:255044462D312E  
Quicken (qdf),文件头:AC9EBD8F  
Windows Password (pwl),文件头:E3828596  
ZIP Archive (zip),文件头:504B0304  
RAR Archive (rar),文件头:52617221  
Wave (wav),文件头:57415645  
AVI (avi),文件头:41564920  
Real Audio (ram),文件头:2E7261FD  
Real Media (rm),文件头:2E524D46  
MPEG (mpg),文件头:000001BA  
MPEG (mpg),文件头:000001B3  
Quicktime (mov),文件头:6D6F6F76  
Windows Media (asf),文件头:3026B2758E66CF11  
MIDI (mid),文件头:4D546864 
 



5.     FileUpload文件上传之客户端文件流级别的文件类型检查 

http://hi.baidu.com/enter%5F0104/blog/item/708b13cc2fd29d1692457edb.html

 

阅读更多
个人分类: Asp.Net C#.NET
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭