服务器端检查两种方式:
1.检查文件的扩展名.


2.读取文件的二进制.

 

 检查文件的扩展名:

 

 

C#代码 复制代码
  1. 检查文件的扩展名:   
  2.        
  3.       //判断是否有上传文件   
  4.         if (FileUpload1.HasFile)   
  5.         {   
  6.             //截取要上传文件的扩展名   
  7.             //string extension = FileUpload1.FileName   
  8.         .Substring(FileUpload1.FileName.LastIndexOf(".")).ToLower();   
  9.             string extension = System.IO.Path   
  10.         .GetExtension(FileUpload1.FileName).ToLower();   
  11.   
  12.             //上传文件是否大于10MB   
  13.             if (FileUpload1.PostedFile.ContentLength < 10485760)   
  14.             {   
  15.                 //设置支持上传的文件格式   
  16.                 string[] allowedextension =    
  17.            { ".jpg"".gif"".jpeg"".bmp"".png" };   
  18.   
  19.                 for (int i = 0; i < allowedextension.Length; i++)   
  20.                 {   
  21.                     //判断上传文件扩展名是否正确   
  22.                     if (!(extension != allowedextension[i]))   
  23.                     {   
  24.                         try  
  25.                         {   
  26.                             //上传文件   
  27.                             FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/")+ FileUpload1.FileName);   
  28.                             lblMessage.Text = "文件上传成功!";   
  29.                             break;   
  30.                         }   
  31.                         catch (Exception ex)   
  32.                         {   
  33.                             lblMessage.Text = "出现错误,无法上传!";   
  34.                         }   
  35.                     }   
  36.                     else  
  37.                     {   
  38.                         lblMessage.Text = "不支持" + extension + "格式的文件!";   
  39.                     }   
  40.                 }   
  41.             }   
  42.             else  
  43.             {   
  44.                 lblMessage.Text = "上传文件大小不能超过10MB!";   
  45.             }   
  46.         }   
  47.         else  
  48.         {   
  49.             lblMessage.Text = "不存在上传文件!";   
  50.         }  

 

 

   以上例子做法的弊端,假设上传文件是.wma文件,把扩展名改成.jpg文件那么将不能被识别,依然能够上传.
    解决方法:通过读取文件的二进制,每种文件的二进制前面两个字节都是不一样的,不同的文件扩展名它的
   二进制前面两个字节是不同的.我们可以通过这种方式来检测文件的扩展名.如:.jpg文件前两个字节是:255216
  .gif文件前两个字节是:7173,6677是BMP,13780是PNG;7790是exe,8297是rar.

   上传文件名相同,文件将被覆盖,我们要对文件名的唯一性处理该怎么办呢?

 

  上传文件名唯一性的处理:
  1.利用时间戳
  2.利用GUID(全局统一标识符)
  GUID的介绍可以参考;http://jhxk.javaeye.com/admin/blogs/393195

 

  读取文件的二进制并且对文件名的唯一性做处理:

 

C#代码 复制代码
  1. protected void btnUpLoad_Click(object sender, EventArgs e)   
  2.    {   
  3.        if (FileUpload1.HasFile)   
  4.        {   
  5.            //判断文件大小是否大于10MB   
  6.            if (FileUpload1.PostedFile.ContentLength < 10485760)   
  7.            {   
  8.                if (CheckFileType())   
  9.                {   
  10.                    try  
  11.                    {   
  12.                        /*使用时间戳精确到毫秒,SessionID,上传文件大小,  
  13.                        5位随机数,来做上传文件名唯一性的处理*/  
  14.                       /* Random rd = new Random();  
  15.                        String fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff")+  
  16.                        rd.Next(10000,99999)+  
  17.                        Session.SessionID +  
  18.                        FileUpload1.PostedFile.ContentLength +  
  19.                        System.IO.Path.GetExtension(FileUpload1.FileName);*/  
  20.   
  21.                        /*如果使用时间戳还觉得不够保险,需要绝对唯一  
  22.                         *那么可以使用GUID(全局的唯一标示符):*/  
  23.                        string fileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(FileUpload1.FileName);   
  24.                           
  25.                        FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/") + fileName);   
  26.   
  27.                        lblMessage.Text = "上传文件成功!";   
  28.                    }   
  29.                    catch (Exception)   
  30.                    {   
  31.                        lblMessage.Text = "出现异常无法上传!";   
  32.                    }   
  33.                }   
  34.                else  
  35.                {   
  36.                    lblMessage.Text = "不支持此文件格式!";   
  37.                }   
  38.            }   
  39.            else  
  40.            {   
  41.                lblMessage.Text = "文件大小不能超过10MB";   
  42.            }   
  43.        }   
  44.        else  
  45.        {   
  46.            lblMessage.Text = "文件不存在,请选择文件!";   
  47.        }   
  48.    }   
  49.   
  50.    //通过读取文件二进制的前两个字节判断文件的类型   
  51.    private bool CheckFileType()   
  52.    {   
  53.        //得到客户端文件的绝对路径   
  54.        String file=FileUpload1.PostedFile.FileName;   
  55.           
  56.        //创建文件流.   
  57.        System.IO.FileStream fs = new System.IO.FileStream(file,System.IO.FileMode.Open,System.IO.FileAccess.Read);   
  58.           
  59.        //创建读取文件二进制的对象   
  60.        System.IO.BinaryReader br=new System.IO.BinaryReader(fs);   
  61.   
  62.        string fileType=String.Empty;   
  63.   
  64.        //读取文件的第一个字节,并将读取位置提升一个字节.   
  65.        fileType = br.ReadByte().ToString();   
  66.           
  67.        //读取第二个字节,并将读取位置提升一个字节.   
  68.        fileType += br.ReadByte().ToString();   
  69.   
  70.        /*如果不知道文件的二进制前两个字节,可以将它打印出来:  
  71.         *  Response.Write(fileBinary);  
  72.         */  
  73.   
  74.        //允许上传文件的扩展名   
  75.        String[] allowtedExtension = {"255216""7173""6677"};   
  76.   
  77.        //判断是否允许上传的文件类型   
  78.        foreach (string allowEx in allowtedExtension)   
  79.        {   
  80.            if (!(allowEx != fileType))   
  81.            {   
  82.                return true;   
  83.            }   
  84.        }   
  85.        return false;   
  86.    }  

 

 文件下载示例:

 

C#代码 复制代码
  1. //加载下载列表   
  2.     protected void Page_Load(object sender, EventArgs e)   
  3.     {   
  4.         if (!IsPostBack)   
  5.         {   
  6.             //首先,获取存放文件目录   
  7.             string directoryPath = Server.MapPath("~/Files");   
  8.   
  9.             //创建目录对象,用来创建,移动和枚举目录及子目录.   
  10.             System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(directoryPath);   
  11.   
  12.             /*获取在这个目录下所有的文件,  
  13.             GetFileSystemInfos()方法返回所有文件和子目录*/  
  14.             System.IO.FileSystemInfo[] infos = dir.GetFileSystemInfos();   
  15.   
  16.             //定义列表选项   
  17.             ListItem myItem;   
  18.   
  19.             //通过foreach遍历整个文件夹里,所有的文件.   
  20.             foreach (System.IO.FileSystemInfo myfile in infos)   
  21.             {   
  22.                 //实例化列表选项   
  23.                 myItem = new ListItem();   
  24.                 //获取文件夹中文件的名称.   
  25.                 myItem.Text = myfile.Name;   
  26.                 //获取文件夹中文件的完整路径名称.   
  27.                 myItem.Value = myfile.FullName;   
  28.                 //将里表项添加到列表框中   
  29.                 ListBox1.Items.Add(myItem);   
  30.             }   
  31.         }   
  32.     }   
  33.   
  34.     //单击下载   
  35.     protected void btnDownLoad_Click(object sender, EventArgs e)   
  36.     {   
  37.         //获取文件的路径名   
  38.         String selectName = ListBox1.SelectedItem.Value;   
  39.   
  40.         //获取文件名   
  41.         String saveFileName = ListBox1.SelectedItem.Text;   
  42.   
  43.         //用来创建,复制,移动,打开文件的实例   
  44.         System.IO.FileInfo finfo = new System.IO.FileInfo(selectName);   
  45.   
  46.         //得到下载文件大小   
  47.         String fileSize=finfo.Length.ToString();   
  48.   
  49.         //首先清空输出流   
  50.         Response.Clear();   
  51.   
  52.         //设置输出流字符集(编码)为UTF-8   
  53.         Response.Charset = "UTF-8";   
  54.   
  55.         Response.ContentEncoding = System.Text.Encoding.UTF8;   
  56.   
  57.         //设置为缓冲输出,处理完整个响应之后发送它   
  58.         Response.Buffer = true;   
  59.   
  60.         //实现动态生成下载的文件名,并进行URL字符串编码,否则文件名为中文会乱码   
  61.         Response.AppendHeader("Content-Disposition""attachment;filename=" +HttpUtility.UrlEncode(saveFileName));   
  62.   
  63.         //设置HTTP MIME类型(输出流的文件类型)   
  64.         //我们使用未知类型,对它的类型不加以限定.   
  65.         Response.ContentType = "application/unknow";   
  66.   
  67.         //不指明Content-Length用Flush的话不会显示下载进度   
  68.         Response.AddHeader("Content-Length", fileSize);   
  69.   
  70.         //将指定文件直接写入HTTP响应输出流   
  71.         Response.WriteFile(selectName);   
  72.   
  73.         //清空缓冲区,向客户端发出所有缓冲输出   
  74.         Response.Flush();   
  75.         Response.Close();   
  76.         Response.End();   
  77.     }  
posted on 2009-08-20 14:49  superlee  阅读(302)  评论(0编辑  收藏  举报