zoukankan      html  css  js  c++  java
  • 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.     }  

     下载示例界面参考:

      

  • 相关阅读:
    第6天c#基础结构体和数组
    第5天c#基础for循环和enum
    第4天c#基础switch和while循环
    第3天c#按位运算和增减buff
    第2天c#基础
    第1天c#基础语法
    背景图层填充底色调密度
    如何在运行里添加命令
    网站
    BAT设置
  • 原文地址:https://www.cnblogs.com/zhangxiaozhong/p/3198540.html
Copyright © 2011-2022 走看看