在写 ASP.NET 应用的时候, 往往会碰到客户端上传文件的情况,这个时候客户一般希望能够想 windows 应用一样, 能够选择文件夹, 浏览所要下载的文件,批量上传, 这个时候. 有几个特征:
其实,我们知道.如果要跟 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 代码如下.
本文地址:http://com.8s8s.com/it/it44561.htm