Asp.Net文件上传之简单文件上传(下)

服务器端检查两种方式:
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.iteye.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.     }  

 下载示例界面参考:

  

原文地址:https://www.cnblogs.com/zhangxiaozhong/p/3198540.html