Загрузка файлов в систему ASP.net без использования серверного элемента управления FileUpload
Как я могу получить ASP.net веб-форма (v3. 5) для публикации файла с помощью простого старого <input type="file" />?
Я не заинтересован в использовании ASP.net серверный элемент управления FileUpload.
Спасибо за ваши предложения.
10 ответов:
в вашем 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))); } }
вот решение, не полагаясь на какой-либо серверный элемент управления, так же, как ОП описал в вопросе.
HTML-код на стороне клиента:
<form action="upload.aspx" method="post" enctype="multipart/form-data"> <input type="file" name="UploadedFile" /> </form>Page_Load метод загрузки.aspx:
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 } }
вам придется установить на
formtomultipart/form-data; затем вы можете получить доступ к загруженному файлу с помощьюHttpRequest.Filesколлекция.
используйте HTML-элемент управления с атрибутом сервера runat
<input id="FileInput" runat="server" type="file" />затем в asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");есть также некоторые 3-ей партии параметры, которые будут показывать прогресс, если вы заинтересованы
Да, вы можете достичь этого с помощью метода 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(); } } } }
Запрос.Коллекция файлов содержит любые файлы, загруженные с вашей формой, независимо от того, были ли они получены из элемента управления FileUpload или написаны вручную
<input type="file">.таким образом, вы можете просто написать простой старый тег ввода файла в середине веб-формы, а затем прочитать файл, загруженный из запроса.Коллекция файлов.
как и другие имеет ответа, запрос.Files-это HttpFileCollection, который содержит все файлы, которые были опубликованы, вам нужно только попросить этот объект для файла следующим образом:
Request.Files["myFile"]но что происходит, когда есть более чем одна входная надбавка с тем же именем атрибута:
Select file 1 <input type="file" name="myFiles" /> Select file 2 <input type="file" name="myFiles" />на стороне сервера предыдущий запрос кода.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); } } }этот метод расширения возвращает все объекты HttpPostedFile, которые имеют имя "myFiles" в коллекции HttpFileCollection, если таковые существуют.
вот статья проекта кода с загружаемым проектом, который призван решить эту проблему. Отказ от ответственности: я не тестировал этот код. 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();
Comments