在ASP.net中上传文件,而不使用FileUpload服务器控件

我怎样才能得到一个ASP.net的网页forms(V3.5)发布文件使用普通的旧<input type="file" />

我对使用ASP.net FileUpload服务器控件不感兴趣。

感谢您的build议。

在你的aspx:

 <form id="form1" runat="server" enctype="multipart/form-data"> <input type="file" id="myFile" name="myFile" /> <asp:Button runat="server" ID="btnUpload" OnClick="btnUploadClick" Text="Upload" /> </form> 

在后面的代码中:

 protected void btnUploadClick(object sender, EventArgs e) { HttpPostedFile file = Request.Files["myFile"]; //check file was submitted if (file != null && file.ContentLength > 0) { string fname = Path.GetFileName(file.FileName); file.SaveAs(Server.MapPath(Path.Combine("~/App_Data/", fname))); } } 

这是一个不依赖任何服务器端控制的解决scheme,就像OP在问题中所描述的一样。

客户端HTML代码:

 <form action="upload.aspx" method="post" enctype="multipart/form-data"> <input type="file" name="UploadedFile" /> </form> 

upload.aspx的Page_Load方法:

 if(Request.Files["UploadedFile"] != null) { HttpPostedFile MyFile = Request.Files["UploadedFile"]; //Setting location to upload files string TargetLocation = Server.MapPath("~/Files/"); try { if (MyFile.ContentLength > 0) { //Determining file name. You can format it as you wish. string FileName = MyFile.FileName; //Determining file size. int FileSize = MyFile.ContentLength; //Creating a byte array corresponding to file size. byte[] FileByteArray = new byte[FileSize]; //Posted file is being pushed into byte array. MyFile.InputStream.Read(FileByteArray, 0, FileSize); //Uploading properly formatted file to server. MyFile.SaveAs(TargetLocation + FileName); } } catch(Exception BlueScreen) { //Handle errors } } 

您必须将formenctype属性设置为multipart/form-data ; 那么你可以使用HttpRequest.Files集合来访问上传的文件。

使用具有runat服务器属性的HTML控件

  <input id="FileInput" runat="server" type="file" /> 

然后在asp.net Codebehind

  FileInput.PostedFile.SaveAs("DestinationPath"); 

如果你感兴趣的话,还有一些第三方的选项可以显示进度

是的,你可以通过ajax post方法来实现这一点。 在服务器端你可以使用httphandler。 所以我们没有按照您的要求使用任何服务器控件。

用ajax你也可以显示上传进度。

您将不得不将该文件作为inputstream读取。

 using (FileStream fs = File.Create("D:\\_Workarea\\" + fileName)) { Byte[] buffer = new Byte[32 * 1024]; int read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length); while (read > 0) { fs.Write(buffer, 0, read); read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length); } } 

示例代码

 function sendFile(file) { debugger; $.ajax({ url: 'handler/FileUploader.ashx?FileName=' + file.name, //server script to process data type: 'POST', xhr: function () { myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { myXhr.upload.addEventListener('progress', progressHandlingFunction, false); } return myXhr; }, success: function (result) { //On success if you want to perform some tasks. }, data: file, cache: false, contentType: false, processData: false }); function progressHandlingFunction(e) { if (e.lengthComputable) { var s = parseInt((e.loaded / e.total) * 100); $("#progress" + currFile).text(s + "%"); $("#progbarWidth" + currFile).width(s + "%"); if (s == 100) { triggerNextFileUpload(); } } } } 

Request.Files集合包含与您的表单上传的任何文件,无论它们是来自FileUpload控件还是来自手动编写的<input type="file">

所以你可以在WebForm的中间写一个普通的旧文件input标签,然后读取从Request.Files集合上传的文件。

正如其他人所回答的,Request.Files是一个HttpFileCollection,它包含了所有发布的文件,你只需要这样的文件就可以了:

 Request.Files["myFile"] 

但是,如果有多个input标记具有相同的属性名称,会发生什么情况:

 Select file 1 <input type="file" name="myFiles" /> Select file 2 <input type="file" name="myFiles" /> 

在服务器端,前面的代码Request.Files [“myFile”]只返回一个HttpPostedFile对象,而不是两个文件。 我在.net 4.5上看到了一个名为GetMultiple的扩展方法,但是对于那些不成熟的版本,它不存在,因此我提出了扩展方法:

 public static IEnumerable<HttpPostedFile> GetMultiple(this HttpFileCollection pCollection, string pName) { for (int i = 0; i < pCollection.Count; i++) { if (pCollection.GetKey(i).Equals(pName)) { yield return pCollection.Get(i); } } } 

此扩展方法将返回HttpFileCollection中名称为“myFiles”的所有HttpPostedFile对象(如果存在)。

HtmlInputFile控件

我一直使用这个。

这里是一个代码项目文章,其下载项目旨在解决这个问题。 免责声明:我没有testing过这个代码。 http://www.codeproject.com/KB/aspnet/fileupload.aspx

 //create a folder in server (~/Uploads) //to upload File.Copy(@"D:\CORREO.txt", Server.MapPath("~/Uploads/CORREO.txt")); //to download Response.ContentType = ContentType; Response.AppendHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName("~/Uploads/CORREO.txt")); Response.WriteFile("~/Uploads/CORREO.txt"); Response.End();