在写 ASP.NET 应用的时候, 往往会碰到客户端上传文件的情况,这个时候客户一般希望能够想 windows 应用一样, 能够选择文件夹, 浏览所要下载的文件,批量上传, 这个时候. 有几个特征:
- 1. 客户可以自由的浏览本地的文件夹, 选择多个文件同时上传.
- 2. 上传之前用户无法预知上传文件的数目.
- 3. 因为是 ASP.NET 应用, 客户端可能没有装 .NET Framework.
其实,我们知道.如果要跟 IE 端客户文件系统交互的话,代码必须在客户端执行. 这个时候我们可以写一个 Activex 控件来实现选择文件夹和上传.
一般我们常用两种方式往服务端上传文件
1. FTP , 可以调用一些现成的 FTP 组件, 在 VB 里面可以调用 Internet Transfer Control
2. HTTP , 使用 HTTP Post application/octet-stream 格式的字节流给服务端.
FTP 很容易实现,我们不予考虑,着重提一下HTTP 的方式.
我们在单个文件上传的时候,一般都有以下的代码:
<%@ Page Language="C#" AutoEventWireup="True" %>
<html> <head> <script runat="server"> void Button1_Click(object sender, EventArgs e) {
// Get the HtmlInputFile control from the Controls collection // of the PlaceHolder control. HtmlInputFile file = (HtmlInputFile)Place.FindControl("File1"); // Make sure a file was submitted. if (Text1.Value == "") { Span1.InnerHtml = "Error: you must enter a file name"; return; } // Save file to server. if (file.PostedFile != null) { try { file.PostedFile.SaveAs("c:\\temp\\"+Text1.Value); Span1.InnerHtml = "File uploaded successfully to " + "<b>c:\\temp\\" + Text1.Value + "</b> on the Web server"; } catch (Exception exc) { Span1.InnerHtml = "Error saving file <b>c:\\temp\\" + Text1.Value + "</b><br>" + exc.ToString(); } } }
void Page_Load(object sender, EventArgs e) {
// Create a new HtmlInputFile control. HtmlInputFile file = new HtmlInputFile(); file.ID = "File1";
// Add the control to the Controls collection of the // PlaceHolder control. Place.Controls.Clear(); Place.Controls.Add(file);
} </script> </head> <body> <h3>HtmlInputFile Constructor Example</h3> <form enctype="multipart/form-data" runat="server"> Specify the file to upload: <asp:PlaceHolder id="Place" runat="server"/> <p> Save as file name (no path): <input id="Text1" type="text" runat="server"> <p> <span id=Span1 style="font: 8pt verdana;" runat="server" />
<p> <input type=button id="Button1" value="Upload" OnServerClick="Button1_Click" runat="server"> </form> </body> </html>
代码有两部分操作:
1. 客户端, 通过用户选择要上传的文件, post 到服务端,这个时候注意 Post 的不是一些普通的表单,而是一个octet-stream 格式的流.
2. 服务端, 如果服务端 是 ASP.NET 处理程序的话, Request 对象有一个 Files 熟悉个您, Files 里面会包含你上传的各个文件内容和文件信息.
你需要做的就是调用一下 File.Save ,把文件复制到你的服务器目录.
我们模拟一下这个过程:
对于客户端, 我们写一个 windows 应用程序.
主要是以下几行代码:
Dim wc As New System.Net.WebClient wc.Credentials = New System.Net.NetworkCredential("username", "password", "domain") wc.UploadFile("http://localhost/aspnet/UPloadFile/WebForm1.aspx", "c:\localfile.txt")
注意: 很多人用 UploadFile ,希望传两个参数,第一个是服务器文件存放的位置, 第二个是本地文件路径.
这个时候, 如果你改为wc.UploadFile("http://localhost/remotefile.txt", "c:\LocalFile.txt"), 一般会报错 405, “Methods are not allowed“, 错误有一点误导. 主要是告诉你 Remotefile.txt 无法处理你的 Post 方法. 而 IIS 的log 也会有类似的提示:
2004-08-13 03:37:57 127.0.0.1 POST /remotefile.txt - 80 - 127.0.0.1 - 405 0 1
所以这个时候明确一点, 服务端必须有一个文件能够处理这个post 过去的数据.
模拟服务端:
服务端就很简单了, 跟上传代码差不多.
新建一个 web form, html 代码如下.

|