总结三种ASP.Net中上传文件的方法

ASP.Net的WebForm开发模式中,封装了FileUpload控件,可以方便的进行文件上传操作。但有时,你可能不希望使用ASP.Net中的服务器控件,仅仅使用Input标签来实现文件上传。当然也是可以的。下面总结在项目中使用过的上传文件的方式。

本文我们总结了三种ASP.Net中上传文件的方法。

一、使用Asp.Net中的FileUpload服务器端控件实现上传

使用asp.net中的服务器端控件FileUpload上传文件非常方便。FileUpload对上传操作进行了封装,你只需要调用SaveAs方法即可完成上传。下面是简单的上传代码。

    <p>服务器端控件上传</p>
    <asp:FileUpload ID="MyFileUpload" runat="server" />
        <asp:Button ID="FileUploadButton" runat="server" Text="上传"
            onclick="FileUploadButton_Click" />

protected void FileUploadButton_Click(object sender, EventArgs e)
        {
            if (MyFileUpload.HasFile)
            {
                string filePath = Server.MapPath("~/UploadFiles/");
                string fileName = MyFileUpload.PostedFile.FileName;
                MyFileUpload.SaveAs(filePath + fileName);
                Response.Write("<p >上传成功!</p>");
            }
            else
            {
                Response.Write("<p >请选择要上传的文件!</p>");
            }
        }

当然,在实际项目中就不能这么简单的保存文件了。你至少得增加一些文件类型的判断,防止用户上传一些能够威胁到系统安全的文件。你可以采用客户端JS验证的方式,也能够在.cs的服务器端代码中验证。

在asp.Net WebForm开发框架下,我们也可以利用Html的Input标签来上传文件。这时候需要注意的一点,这个type为file的Input标签需要加上runat="server"属性,否则在后台Request.Files获取不到上传的文件。

  <p>使用Html的Input标签上传</p>
    <input type="file" name="MyFileUploadInput" runat="server" /><asp:Button
            ID="InputFileUploadButton" runat="server" Text="上传"
            onclick="InputFileUploadButton_Click" />

protected void InputFileUploadButton_Click(object sender, EventArgs e)
        {
            HttpFileCollection files = Request.Files;
            string filePath = Server.MapPath("~/UploadFiles/");
            if (files.Count != 0)
            {
                string fileName = files[0].FileName;
                files[0].SaveAs(Path.Combine(filePath, fileName));
                Response.Write("<p>上传成功</p>");
            }
            else
            {
                Response.Write("<p>未获取到Files:"+ files.Count.ToString()+"</p>");
            }
        }
        
以这种方式进行上传的时候,好处就是可以方便的用JS生成多个Input标签来上传多个文件。且此时需要注意的是,Input标签必须要有name属性。在后台,只需要循环调用SaveAs()方法即可。

接下来的两种上传方式(二和三)都会用到Ajax异步提交数据,后台使用一个.ashx文件进行处理。两种方式共用一个文件,ajax传入的url参数中加一个method来区分哪种方式传过来的。后台代码如下:

public void ProcessRequest(HttpContext context)
        {
            string method = context.Request.QueryString["method"].ToString();
            switch (method)
            {
                case "ajaxFileUpload":
                    ajaxFileUpload(context);
                    break;
                case "formDataUpload":
                    formDataUpload(context);
                    break;
                default:
                    break;
            }
        }

        private static void formDataUpload(HttpContext context)
        {
            HttpFileCollection files = context.Request.Files;

            string msg = string.Empty;
            string error = string.Empty;
            if (files.Count > 0)
            {
                files[0].SaveAs(ConfigurationManager.AppSettings["FilePath"].ToString() + System.IO.Path.GetFileName(files[0].FileName));
                msg = " 成功! 文件大小为:" + files[0].ContentLength;
                string res = "{ error:'" + error + "', msg:'" + msg + "'}";
                context.Response.Write(res);
                context.Response.End();
            }
        }

        private static void ajaxFileUpload(HttpContext context)
        {
            HttpFileCollection files = context.Request.Files;

            string msg = string.Empty;
            string error = string.Empty;
            if (files.Count > 0)
            {
                files[0].SaveAs(ConfigurationManager.AppSettings["FilePath"].ToString() + System.IO.Path.GetFileName(files[0].FileName));
                msg = " 成功! 文件大小为:" + files[0].ContentLength;
                string res = "{ error:'" + error + "', msg:'" + msg + "'}";
                context.Response.Write(res);
                context.Response.End();
            }
        }

二、使用Html中的Input标签加FormData对象实现

使用这种方式上传附件,对浏览器有些要求。FormData属于Html5中新增的特性,IE浏览器只有在10以上才支持。所以,个中利弊自己权衡,但用起来觉得方便。下面直接上代码:

function formDataUpload() {
            var fileupload = document.getElementById('fileToUpload').files;
            var formdata = new FormData();
            formdata.append('files', fileupload[0]);
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open("post", 'Handlers/FileUpload.ashx?method=formDataUpload');
            xmlHttp.onreadystatechange = function () {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    alert('上传成功');
                }
            }
            xmlHttp.send(formdata);
        }

三、使用Jquery中的ajaxfileupload.js插件实现上传

使用此方法,需要引用jquery.js和ajaxfileupload.js两个文件。还需要注意的部分是两个文件的版本匹配问题,可能在使用过程中会出现些异常。此时发挥搜索引擎的作用,总能找到你需要的解决方案。

JavaScript代码如下:

function ajaxFileUpLoad() {
        $.ajaxFileUpload(
            {
                url: 'Handlers/FileUpload.ashx?method=ajaxFileUpload',
                secureuri: false,
                fileElementId: 'fileToUpload',
                dataType: 'json',
                success: function (data, status) {
                    $('#img1').attr("src", data.imgurl);
                    if (typeof (data.error) != 'undefined') {
                        if (data.error != '') {
                            alert(data.error);
                        } else {
                            alert(data.msg);
                        }
                    }
                },
                error: function (data, status, e) {
                    alert(e);
                }
            }
        )
        return false;
    }

Html页面上的代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
<script type="text/javascript" src="Scripts/ajaxfileupload.js"></script>
<script type="text/javascript">
    $(function () {
        $("#ajaxfileuploadButton").click(function () {
            ajaxFileUpLoad();
        })

        $("#formdataButton").click(function () {
            formDataUpload();
        })
    });

</script>
    <title></title>
    <script type="text/javascript">
     
    </script>
</head>
<body>
<input type="file" id="fileToUpload" name="fileToUpload" />
<input type="button" id="ajaxfileuploadButton" value="ajaxfileupload插件上传" />
<input type="button" id="formdataButton" value="FormData方式上传" />
</body>
</html>
 

总结

以上总结了几种上传文件的方式,也简单的说明了一些使用中需要注意的问题。当然,可能遇到的问题还不止这些,如果在开发过程中还遇到了其他稀奇古怪的问题,可自行搜索相关问题。每一次针对遇到的问题的解决,都是对这方面的知识一次更深入的理解。在不断解决问题中慢慢进步。

时间: 2024-09-20 04:24:05

总结三种ASP.Net中上传文件的方法的相关文章

谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法_javascript技巧

发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明:      html如下所示,请求的路径action为"upload",其它的不做任何处理: <form method="POST" action="upload" enctype="multipart/form-data"> 名字 <input type="t

ASP.NET中上传文件的方法(一)

asp.net|上传 先介绍一个也许是最简单的.1:新建一个WebForm,命名.2:从控件工具箱中拖一个File控件(HTML控件),为其增加Runat=server属性,增加Name属性和ID属性.3:再从Web控件中拖放一个Button控件和一个Label控件.4:双击Button控件,在其Click事件处理函数中添加如下代码: if(file1.PostedFile.FileName!="") { string sFile=file1.PostedFile.FileName;

三种asp.net页面跳转的方法_实用技巧

第一种方法:response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但它可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护.但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端.需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session.代码如下  using System; using System

ASP.net中上传文件的操作

asp.net|上传 作者:abigfrog(千年精灵)(★JAVA★) <一>.选择本地要上传到服务器的文件 首先要感谢ASP.NET的强大功能,他提供的HTML控制元件,使得我们很容易的通过一个对话框来选择要上传的文件.当然你的浏览器也必须是IE 3.02 或者Netscape 3.0版本或者比这二者版本高的浏览器.通过下列语句就可以完成选择本地一个文件的工作: <input id = " loFile " type = " file " ru

ASP.NET中上传文件到数据库

asp.net|上传|数据|数据库 介绍 为什么要将文件保存到数据库呢?理由很多,最直接的就是,将文件放入数据库以后,可以对文件进行更好的管理,特别是文本文件.图片等,如果不使用数据库,数量巨大的时候,很难做到有效的管理和区别.特别是需要作一些与文字密切相关的应用的时候,将文件全部放入数据库是最好的选择,对文字的处理.检索等,都可以直接利用数据库的一些功能,可以做到真正的有效管理.本文举例主要针对以文字为基础的文件,比如WORD等,但是,实际上对程序稍微修改,就可以上传所有文件类型. 数据表结构

如何限制asp.net中上传文件的大小的代码_实用技巧

在web.config中控制上传文件大小的地方: 复制代码 代码如下: <system.web><httpRuntime executionTimeout="9999" maxRequestLength="2097151"/></system.web> maxRequestLength是控制上传大小得参数请求的最大大小(以千字节为单位).默认大小为 4096 KB (4 MB).ExecutionTimeout 指示在请求被 AS

解析ASP.NET应用程序中上传文件的方案

在Web程序中上传文件是很常见的需求.利用HTTP协议上传文件的方式非常有限,最常见的莫过于使用<input type="file" />元素进行上传.这种上传方式会将内容使用multipart/form-data方案进行编码,并将内容POST到服务器端.使用multipart/form-data编码方式与默认的application/x-url-encoded编码方式相比,在大数据量情况下效率要高很多. 使用<input type="file"

微信网页中上传文件时“只能选择SD卡中的文件”问题

问题描述 微信网页中上传文件时"只能选择SD卡中的文件"问题 解决方案 这个应该是微信上传文件的设置问题吧,我的也是这样. 解决方案二: 微信有jssdk拍照上传接口,可以看看相关文档. 解决方案三: 应该是设置中的问题吧

asp.NET上传文件到指定文件夹,ACCESS数据库,SQL数据库代码

access|asp.net|上传|数据|数据库 /* 我修改了一天时间.终于找到门路了.呵呵ACCESS中存放文件内容的字段类型为:OLE对象SQL中存放文件内容的字段类型为:image此代码为上传文件代码.梢后整理发布下载文件代码 代码设计实现功能:asp.NET上传文件到指定文件夹,ACCESS数据库,SQL数据库代码 已经测试文件格式 .TXT,JPG..MDB.GIF */ using System;using System.Collections;using System.Compo