ASP.Net中上传文件的几种方法

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

一、使用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" />
 1    protected void FileUploadButton_Click(object sender, EventArgs e)
 2         {
 3             if (MyFileUpload.HasFile)
 4             {
 5                 string filePath = Server.MapPath("~/UploadFiles/");
 6                 string fileName = MyFileUpload.PostedFile.FileName;
 7                 MyFileUpload.SaveAs(filePath + fileName);
 8                 Response.Write("<p >上传成功!</p>");
 9             }
10             else
11             {
12                 Response.Write("<p >请选择要上传的文件!</p>");
13             }
14         }

当然,在实际项目中就不能这么简单的保存文件了。你至少得增加一些文件类型的判断,防止用户上传一些能够威胁到系统安全的文件。你可以采用客户端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" />
 1         protected void InputFileUploadButton_Click(object sender, EventArgs e)
 2         {
 3             HttpFileCollection files = Request.Files;
 4             string filePath = Server.MapPath("~/UploadFiles/");
 5             if (files.Count != 0)
 6             {
 7                 string fileName = files[0].FileName;
 8                 files[0].SaveAs(Path.Combine(filePath, fileName));
 9                 Response.Write("<p>上传成功</p>");
10             }
11             else
12             {
13                 Response.Write("<p>未获取到Files:"+ files.Count.ToString()+"</p>");
14             }
15         }

以这种方式进行上传的时候,好处就是可以方便的用JS生成多个Input标签来上传多个文件。且此时需要注意的是,Input标签必须要有name属性。在后台,只需要循环调用SaveAs()方法即可。

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

 1    public void ProcessRequest(HttpContext context)
 2         {
 3             string method = context.Request.QueryString["method"].ToString();
 4             switch (method)
 5             {
 6                 case "ajaxFileUpload":
 7                     ajaxFileUpload(context);
 8                     break;
 9                 case "formDataUpload":
10                     formDataUpload(context);
11                     break;
12                 default:
13                     break;
14             }
15         }
16
17         private static void formDataUpload(HttpContext context)
18         {
19             HttpFileCollection files = context.Request.Files;
20
21             string msg = string.Empty;
22             string error = string.Empty;
23             if (files.Count > 0)
24             {
25                 files[0].SaveAs(ConfigurationManager.AppSettings["FilePath"].ToString() + System.IO.Path.GetFileName(files[0].FileName));
26                 msg = " 成功! 文件大小为:" + files[0].ContentLength;
27                 string res = "{ error:‘" + error + "‘, msg:‘" + msg + "‘}";
28                 context.Response.Write(res);
29                 context.Response.End();
30             }
31         }
32
33         private static void ajaxFileUpload(HttpContext context)
34         {
35             HttpFileCollection files = context.Request.Files;
36
37             string msg = string.Empty;
38             string error = string.Empty;
39             if (files.Count > 0)
40             {
41                 files[0].SaveAs(ConfigurationManager.AppSettings["FilePath"].ToString() + System.IO.Path.GetFileName(files[0].FileName));
42                 msg = " 成功! 文件大小为:" + files[0].ContentLength;
43                 string res = "{ error:‘" + error + "‘, msg:‘" + msg + "‘}";
44                 context.Response.Write(res);
45                 context.Response.End();
46             }
47         }

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

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

 1   function formDataUpload() {
 2             var fileupload = document.getElementById(‘fileToUpload‘).files;
 3             var formdata = new FormData();
 4             formdata.append(‘files‘, fileupload[0]);
 5             var xmlHttp = new XMLHttpRequest();
 6             xmlHttp.open("post", ‘Handlers/FileUpload.ashx?method=formDataUpload‘);
 7             xmlHttp.onreadystatechange = function () {
 8                 if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
 9                     alert(‘上传成功‘);
10                 }
11             }
12             xmlHttp.send(formdata);
13         }

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

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

JavaScript代码如下:

 1     function ajaxFileUpLoad() {
 2         $.ajaxFileUpload(
 3             {
 4                 url: ‘Handlers/FileUpload.ashx?method=ajaxFileUpload‘,
 5                 secureuri: false,
 6                 fileElementId: ‘fileToUpload‘,
 7                 dataType: ‘json‘,
 8                 success: function (data, status) {
 9                     $(‘#img1‘).attr("src", data.imgurl);
10                     if (typeof (data.error) != ‘undefined‘) {
11                         if (data.error != ‘‘) {
12                             alert(data.error);
13                         } else {
14                             alert(data.msg);
15                         }
16                     }
17                 },
18                 error: function (data, status, e) {
19                     alert(e);
20                 }
21             }
22         )
23         return false;
24     }

Html页面上的代码如下:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3 <script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
 4 <script type="text/javascript" src="Scripts/ajaxfileupload.js"></script>
 5 <script type="text/javascript">
 6     $(function () {
 7         $("#ajaxfileuploadButton").click(function () {
 8             ajaxFileUpLoad();
 9         })
10
11         $("#formdataButton").click(function () {
12             formDataUpload();
13         })
14     });
15
16 </script>
17     <title></title>
18     <script type="text/javascript">
19
20     </script>
21 </head>
22 <body>
23 <input type="file" id="fileToUpload" name="fileToUpload" />
24 <input type="button" id="ajaxfileuploadButton" value="ajaxfileupload插件上传" />
25 <input type="button" id="formdataButton" value="FormData方式上传" />
26 </body>
27 </html>

总结

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

时间: 2024-08-25 12:53:54

ASP.Net中上传文件的几种方法的相关文章

ASP.NET上传文件的几种方法

//上传文件实例 if (fileDealer.HasFile)//判断文件是否存在        {            string filepath = "";            try            {                string path = fileDealer.FileName;                string filename = path.Split('.')[0] + "_" + DateTime.Now

linux中传文件的三种方法、windows

第一种方法:使用vsftpd服务 ftp配置文件主要内容:[[email protected] vsftpd]# cat vsftpd.conf|grep -v ^#|grep -v ^$anonymous_enable=YES #匿名登陆local_enable=YES #允许使用本地用户来登陆ftplocal_root=/var/ftp/pub #write_enable=YES #开放本地用户写的权限local_umask=022 #FTP上本地的文件权限,默认是077 anon_uplo

GitHub常用上传文件的两种方法 附带常见的问题及Git安装教程

从早上下课到现在一直在琢磨如何给Gethub下载本地文件,中午饭都没吃.还好是解决了,感觉挺有成就感的.O(∩_∩)O哈哈~ 好哒 闲话不说,说重点. 一.git的安装 百度云:http://pan.baidu.com/s/1mhFy8Ik 打开后 点next 2.继续点next 3.继续点next 4.选第一行是默认windows使用 选第二行是Windows和Linux都可以 点next 5.可以不用管,选择默认就可以了 点next 6.安装成功后弹出 7 这时候你找到你的git文件夹,点击

ASP.NET上传文件的三种基本方法

ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关键代码: [html] view plain copy <form id="form1" runat="server"> <asp:FileUpload ID="FileUpload1" runat="server&quo

django中上传文件的三种方式

前端代码: <style> .upload{ display: inline-block;padding: 10px; background-color: brown; position: absolute; top: 0; bottom: 0; right: 0; left: 0; z-index: 90; } .file{ width: 100px;height: 50px;opacity: 0; position: absolute; top: 0; bottom: 0; right:

SecureCRT 上传文件的两种方法 Zmodem、SFTP

Zmodem: 无论有xshell还是secureCRT连接linux的时. 默认都用一个zmodem可以帮助window和linux之间传输文件 很方便和实用的工具. 不过默认是无法使用的 需要安装lrzsz软件 直接云安装就可以了 yum install  lrzsz 安装完之后,如果windows要给linux传文件.只需要点住文件,拖动到xshen窗口即可传输 如果linux要给window传文件,那就直接 sz filename 后 window就会自动弹出文件接收存放地址的窗口. S

如何往虚拟机内传文件的3种方法

多分享,总有用到的时候. ------------------------------------------------------------------------ 文件共享方法一 一.创建共享文件夹(这种方法最适合Windows系统,专治各种无法传送问题) 共享文件的意义在于可以把宿主机的文件传到虚拟机内,这是VMware 自带的传文件功能,非常好用. 前置条件: 在宿主机建立一个共享文件夹 操作步骤: 1) 在宿主机创建个文件夹 2) 右键"属性", 3) 点击'共享'列名,

asp.net mvc传文件[转载]

利用Asp.net MVC处理文件的上传下载 如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个,而这个控件的缺席给我们带来一些小问题.这篇文章主要说如何在Asp.net MVC中上传文件,然后如何再从服务器中把上传过的文件下载下来. 在Web Forms中,当你把一个FileUpload控件拖到设计器中,你或许没有注意到在生成的HTML中会在for

asp.net上传文件

第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ Page Language="C#" EnableViewState="false"%> <%@ Import Namespace="System.Net" %> <%@ Import Namespace="Syst