在ASP中,将文件上传到服务器是一件非常麻烦的事情,通常需要第三方组件的支持。
在ASP.NET 1.x 中,要支持文件上传,只须使用HTML的Input(File)控件。把它作为服务器控件运行(手动设置runat="server") ,要直接操作 HttpPostedFile。
在ASP.NET 2.0中,新增了FileUpLoad服务器控件,使得上传更加简单。
包裝了一點點程式碼,我們不用再直接操作 HttpPostedFile,程式稍微簡潔了些。但是其內部還是在操作 HttpPostedFile。真正有價值的差異是 FileUpload 控制項的 FileBytes 屬性。
FileBytes 回傳的是 byte 陣列,等於是幫我們做了序列化,讓檔案上傳機制有了更多可能性,可以更方便的將檔案內容直接轉存到資料庫,或是將檔案傳遞給遠方 WebService 接收 .....
還有 FileBytes 屬性被標記為 Bindable(true),更可以將 FileUpload 控制項輕鬆搭配資料繫結控制項(例如 FormView)、DataSource 控制項(例如 ObjectDataSource),作資料繫結,當然省了相當多程式碼。
关于Input(File)和FileUpload的区别?
FileUpload是asp.net控件,input(file)是html静态控件。
一直提倡尽量使用HTML控件,而不要使用服务器控件,好像惟独这个是例外的。
一般情况下建议用FileUpload,如果在IE上要动态加入提交文件的数量,可以用html,js操作,方便。
input(File)控件使用例子。
如下面上传图片的例子。
首先申明使用命名空间。using System.IO;
在设计页面拖进一个input(File)控件,并把它作为服务器控件运行。其ID为myFile;然后拖进一个button,给button的单击时间添加如下代码:
protected void submit_Click(object sender, EventArgs e)
{
string phName = this.txtName.Text;
string phType = this.ddlType.SelectedValue;
if (this.myFile.PostedFile != null)
{
string photoName1 = myFile.PostedFile.FileName; //获取初始文件名
int i = photoName1.LastIndexOf("."); //取得文件名中最后一个"."的索引
string newext = photoName1.Substring(i); //获取文件扩展名
if (newext != ".gif" && newext != ".jpg"&&newext!=".jpeg" && newext != ".bmp" && newext != ".png")
{
Response.Write("文件格式不正确!");
Response.End();
}
DateTime now = DateTime.Now; //获取系统时间
string photoName2 = now.Millisecond.ToString() + "_" + myFile.PostedFile.ContentLength.ToString() + newext; //重新为文件命名,时间毫秒部分+文件大小+扩展名
myFile.PostedFile.SaveAs(Server.MapPath("photos" + photoName2)); // 保存文件到路径,用Server.MapPath()取当前文件的绝对目录.在asp.net里"/"必须用""代替
}
}
HtmlInputFile对象与HTML文件输入元素对应。你可用由id属性指定的名称来访问它。它有下列特性:
* PostedFile:上传文件的内容。
* Accept:以逗号界定的MIME类型列表,指定可能提交的文件类型。
* MaxLength:要提交的文件的最长文件名长度(包括路径)。
* Size:用户输入/选择上传文件的文本框宽度。
以下是HTML输入控制的方法与特性:
* FileName:用户计算机上的完全合格的文件名称。它还包含上传文件的本地路径。
* ContentLength:上传文件的大小(字节)。
* ContentType:上传文件的MIME内容类型。
* InputStream:返回一个指向上传文件的流(Stream)对象,允许你阅读文件内容。
* SaveAs:方便保存上传文件的内容。
FileUpload控件使用例子
待续。。。