`

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

阅读更多

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


2.读取文件的二进制.

 

 检查文件的扩展名:

 

 

检查文件的扩展名:
	
	  //判断是否有上传文件
        if (FileUpload1.HasFile)
        {
            //截取要上传文件的扩展名
            //string extension = FileUpload1.FileName
		.Substring(FileUpload1.FileName.LastIndexOf(".")).ToLower();
            string extension = System.IO.Path
		.GetExtension(FileUpload1.FileName).ToLower();

            //上传文件是否大于10MB
            if (FileUpload1.PostedFile.ContentLength < 10485760)
            {
                //设置支持上传的文件格式
                string[] allowedextension = 
		   { ".jpg", ".gif", ".jpeg", ".bmp", ".png" };

                for (int i = 0; i < allowedextension.Length; i++)
                {
                    //判断上传文件扩展名是否正确
                    if (!(extension != allowedextension[i]))
                    {
                        try
                        {
                            //上传文件
                            FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/")+ FileUpload1.FileName);
                            lblMessage.Text = "文件上传成功!";
                            break;
                        }
                        catch (Exception ex)
                        {
                            lblMessage.Text = "出现错误,无法上传!";
                        }
                    }
                    else
                    {
                        lblMessage.Text = "不支持" + extension + "格式的文件!";
                    }
                }
            }
            else
            {
                lblMessage.Text = "上传文件大小不能超过10MB!";
            }
        }
        else
        {
            lblMessage.Text = "不存在上传文件!";
        }

 

 

   以上例子做法的弊端,假设上传文件是.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

 

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

 

 protected void btnUpLoad_Click(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile)
        {
            //判断文件大小是否大于10MB
            if (FileUpload1.PostedFile.ContentLength < 10485760)
            {
                if (CheckFileType())
                {
                    try
                    {
                        /*使用时间戳精确到毫秒,SessionID,上传文件大小,
                        5位随机数,来做上传文件名唯一性的处理*/
                       /* Random rd = new Random();
                        String fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff")+
                        rd.Next(10000,99999)+
                        Session.SessionID +
                        FileUpload1.PostedFile.ContentLength +
                        System.IO.Path.GetExtension(FileUpload1.FileName);*/

                        /*如果使用时间戳还觉得不够保险,需要绝对唯一
                         *那么可以使用GUID(全局的唯一标示符):*/
                        string fileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(FileUpload1.FileName);
                        
                        FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/") + fileName);

                        lblMessage.Text = "上传文件成功!";
                    }
                    catch (Exception)
                    {
                        lblMessage.Text = "出现异常无法上传!";
                    }
                }
                else
                {
                    lblMessage.Text = "不支持此文件格式!";
                }
            }
            else
            {
                lblMessage.Text = "文件大小不能超过10MB";
            }
        }
        else
        {
            lblMessage.Text = "文件不存在,请选择文件!";
        }
    }

    //通过读取文件二进制的前两个字节判断文件的类型
    private bool CheckFileType()
    {
        //得到客户端文件的绝对路径
        String file=FileUpload1.PostedFile.FileName;
        
        //创建文件流.
        System.IO.FileStream fs = new System.IO.FileStream(file,System.IO.FileMode.Open,System.IO.FileAccess.Read);
        
        //创建读取文件二进制的对象
        System.IO.BinaryReader br=new System.IO.BinaryReader(fs);

        string fileType=String.Empty;

        //读取文件的第一个字节,并将读取位置提升一个字节.
        fileType = br.ReadByte().ToString();
        
        //读取第二个字节,并将读取位置提升一个字节.
        fileType += br.ReadByte().ToString();

        /*如果不知道文件的二进制前两个字节,可以将它打印出来:
         *  Response.Write(fileBinary);
         */

        //允许上传文件的扩展名
        String[] allowtedExtension = {"255216", "7173", "6677"};

        //判断是否允许上传的文件类型
        foreach (string allowEx in allowtedExtension)
        {
            if (!(allowEx != fileType))
            {
                return true;
            }
        }
        return false;
    }

 

 文件下载示例:

 

//加载下载列表
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //首先,获取存放文件目录
            string directoryPath = Server.MapPath("~/Files");

            //创建目录对象,用来创建,移动和枚举目录及子目录.
            System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(directoryPath);

            /*获取在这个目录下所有的文件,
            GetFileSystemInfos()方法返回所有文件和子目录*/
            System.IO.FileSystemInfo[] infos = dir.GetFileSystemInfos();

            //定义列表选项
            ListItem myItem;

            //通过foreach遍历整个文件夹里,所有的文件.
            foreach (System.IO.FileSystemInfo myfile in infos)
            {
                //实例化列表选项
                myItem = new ListItem();
                //获取文件夹中文件的名称.
                myItem.Text = myfile.Name;
                //获取文件夹中文件的完整路径名称.
                myItem.Value = myfile.FullName;
                //将里表项添加到列表框中
                ListBox1.Items.Add(myItem);
            }
        }
    }

    //单击下载
    protected void btnDownLoad_Click(object sender, EventArgs e)
    {
        //获取文件的路径名
        String selectName = ListBox1.SelectedItem.Value;

        //获取文件名
        String saveFileName = ListBox1.SelectedItem.Text;

        //用来创建,复制,移动,打开文件的实例
        System.IO.FileInfo finfo = new System.IO.FileInfo(selectName);

        //得到下载文件大小
        String fileSize=finfo.Length.ToString();

        //首先清空输出流
        Response.Clear();

        //设置输出流字符集(编码)为UTF-8
        Response.Charset = "UTF-8";

        Response.ContentEncoding = System.Text.Encoding.UTF8;

        //设置为缓冲输出,处理完整个响应之后发送它
        Response.Buffer = true;

        //实现动态生成下载的文件名,并进行URL字符串编码,否则文件名为中文会乱码
        Response.AppendHeader("Content-Disposition", "attachment;filename=" +HttpUtility.UrlEncode(saveFileName));

        //设置HTTP MIME类型(输出流的文件类型)
        //我们使用未知类型,对它的类型不加以限定.
        Response.ContentType = "application/unknow";

        //不指明Content-Length用Flush的话不会显示下载进度
        Response.AddHeader("Content-Length", fileSize);

        //将指定文件直接写入HTTP响应输出流
        Response.WriteFile(selectName);

        //清空缓冲区,向客户端发出所有缓冲输出
        Response.Flush();
        Response.Close();
        Response.End();
    }

 下载示例界面参考:

 

  • 大小: 7.9 KB
分享到:
评论

相关推荐

    asp.net文件上传示例

    总结来说,这个"asp.net文件上传示例"是一个基础的学习资源,它教你如何在VS2005环境下创建一个简单的文件上传功能。通过学习这个示例,你可以理解文件上传的基本机制,并在此基础上扩展和优化,以适应各种实际的Web...

    asp.net 批量上传文件

    在这个场景下,我们可以使用jQuery库中的`jquery.form`插件来增强页面的交互性,并结合ASP.NET后端技术,实现异步、无刷新的批量文件上传功能。下面我们将详细探讨这个过程中的关键知识点。 首先,`jQuery.form`...

    asp.net文件上传

    #### 一、ASP.NET文件上传概述 在ASP.NET应用程序中,文件上传是一项常用的功能。用户可以将本地计算机上的文件发送到服务器进行存储或处理。这通常通过HTML表单中的`&lt;input type="file"&gt;`元素实现,并在服务器端...

    【ASP.NET编程知识】asp.net单文件带进度条上传的解决方案.docx

    本文主要讲述了ASP.NET单文件带进度条上传的解决方案,通过使用jquery框架和ASP.NET缓存机制,实现了文件上传和进度条显示的功能。 知识点1:使用jquery框架实现文件上传 在本文中,我们使用jquery框架来实现文件...

    asp.net 超大文件上传,带进度条源码,亲测能用

    在处理大文件上传时,ASP.NET需要特别的处理,因为默认情况下,它对上传文件的大小有限制,通常为4MB左右。针对超大文件上传的需求,开发者通常需要采取一些策略来优化和扩展这一功能,同时加入进度条显示可以提升...

    asp.net 文件上传源码

    接下来,我们将深入探讨ASP.NET文件上传的核心概念、实现步骤以及可能遇到的问题。 1. **文件上传基础** ASP.NET中的文件上传主要通过`HttpPostedFileBase`类来处理。当用户在表单中包含一个`&lt;input type="file"&gt;`...

    asp.net文件上传源码

    下面我们将深入探讨ASP.NET文件上传的相关知识点。 首先,`uploadpic_zpfj.aspx` 是一个ASP.NET Web Form页面,它通常包含HTML元素,如表单(`&lt;form&gt;`)和输入元素(`&lt;input type="file"&gt;`),用于用户选择要上传的...

    asp.net 文件上传demo

    在ASP.NET环境中,文件上传是一项常见的功能,尤其在构建交互性强、用户友好的Web应用程序时。本示例“asp.net 文件上传demo”是基于.NET框架3.5的一个演示项目,它利用了Flash技术来增强文件上传体验,同时支持大...

    简单的ASP.NET文件上传类附示例程序

    下面将详细解释这个简单的ASP.NET文件上传类及其示例程序中的关键知识点。 首先,`FileUpload`控件是ASP.NET Web Forms中用于文件上传的标准控件。在HTML页面上,它通常表现为一个输入框和一个浏览按钮,用户可以...

    ASP.NET通过HTML的上传文件标签来上传文件

    在ASP.NET中处理文件上传是常见的需求,尤其是在用户需要提交图片、文档或其他数据文件时。这篇博客文章“ASP.NET通过HTML的上传文件标签来上传文件”将引导我们了解如何在ASP.NET环境中实现文件上传功能。 首先,...

    asp.net文件上传下载程序 有数据库 下载可用

    ASP.NET文件上传下载程序是一个基于微软的ASP.NET技术构建的应用,用于实现用户在Web端上传和下载文件。这种程序通常包含后端服务器处理逻辑和前端用户界面,与数据库结合以存储文件元数据,如文件名、大小、上传...

    Extjs结合Asp.net文件上传

    标题中的“Extjs结合Asp.net文件上传”指的是在Web应用程序开发中,使用Ext JS(一个JavaScript库)和ASP.NET(Microsoft的服务器端技术)来实现文件上传功能。这一组合可以提供用户友好的界面和强大的后台处理能力...

    asp.net文件上传带进度条

    1. **ASP.NET文件上传基础**: ASP.NET提供了多种文件上传方式,如HTML `&lt;input type="file"&gt;` 元素配合Form表单提交,或者使用控件如ASP.NET FileUpload控件。但是,这两种方法都无法在上传过程中显示进度条。 2....

    基于ASP.NET文件上传、下载的网络硬盘系统 源码

    【ASP.NET文件上传与下载系统】是一个典型的Web应用程序,它允许用户通过网络进行文件的上传和下载操作。这个系统基于微软的ASP.NET框架构建,利用了ASP.NET的强大功能和高效性能,为用户提供了一种安全、便捷的方式...

    asp.net+flash批量上传

    asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件...

    ASP.NET Ajax 文件上传进度条源码示例

    各种注视用户体验的程序出现,比如带进度条的文件上传,看了网上很多资料还没找到真正意义上的ASP.NET实现进度条上传.Ajax 文件上传进度条,ASP.NET 文件上传进度条示例,ASP.NET 文件上传,asp.net文件上传,ajax文件...

    asp.net自定义固定格式多文件批量上传

    在ASP.NET中,实现自定义固定格式的多文件批量上传是一项常见的需求,这涉及到Web开发中的文件上传控件、服务器端处理以及客户端交互等多个技术环节。以下是对这一知识点的详细阐述: 1. **文件上传控件**:在ASP...

    【ASP.NET编程知识】ASP.NET Core文件上传与下载实例(多种上传方式).docx

    ASP.NET Core 文件上传与下载实例(多种上传方式) 知识点1: ASP.NET Core 文件上传与下载实例 ASP.NET Core 2.0 已经很成熟,可以使用模型绑定上传文件。官方文档提供了相关的示例代码,可以作为参考。 知识点2:...

    ASP.NET Web API 接收文件上传

    在ASP.NET Web API中处理文件上传是常见的需求,特别是当你需要允许用户通过Web界面提交文件时。本文将深入探讨如何在ASP.NET Web API中实现文件上传功能,并涉及MIME多部分类型。 首先,让我们了解MIME...

Global site tag (gtag.js) - Google Analytics