net mvc fileupload asp asp.net upload file-upload

mvc - Cargar archivos en ASP.net sin usar el control de servidor FileUpload



upload file mvc 5 (10)

Aquí hay un artículo de Code Project con un proyecto descargable que pretende resolver esto. Descargo de responsabilidad: no he probado este código. http://www.codeproject.com/KB/aspnet/fileupload.aspx

¿Cómo puedo obtener un formulario web ASP.net (v3.5) para publicar un archivo usando un viejo y simple <input type="file" /> ?

No estoy interesado en usar el control de servidor ASP.net FileUpload.

Gracias por tus sugerencias


Aquí hay una solución sin depender de ningún control del lado del servidor, tal como lo describió OP en la pregunta.

Código HTML del lado del cliente:

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

Método de carga de página.aspx de 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 } }


Como otros han respondido, Request.Files es una HttpFileCollection que contiene todos los archivos que se publicaron, solo necesita pedir ese objeto para el archivo de esta manera:

Request.Files["myFile"]

Pero, ¿qué ocurre cuando hay más de un marcado de entrada con el mismo nombre de atributo?

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

En el lado del servidor, el código anterior Request.Files ["myFile"] solo devuelve un objeto HttpPostedFile en lugar de los dos archivos. He visto en .net 4.5 un método de extensión llamado GetMultiple, pero para las versiones precarias no existe, para ese caso propongo el método de extensión como:

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); } } }

Este método de extensión devolverá todos los objetos HttpPostedFile que tengan el nombre "myFiles" en HttpFileCollection, si existe alguno.


Deberá establecer el atributo enctype del form en multipart/form-data ; luego puede acceder al archivo cargado utilizando la colección HttpRequest.Files .


En tu 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>

En código detrás:

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))); } }


La colección Request.Files contiene todos los archivos cargados con su formulario, independientemente de si provienen de un control FileUpload o de un <input type="file"> escrito manualmente.

De modo que puede escribir una etiqueta simple de entrada de archivos en el medio de su WebForm, y luego leer el archivo cargado desde la colección Request.Files.


Sí, puedes lograr esto mediante el método de publicación ajax. en el lado del servidor puede usar httphandler. Así que no estamos utilizando ningún control de servidor según su requisito.

con ajax también puedes mostrar el progreso de carga.

Tendrás que leer el archivo como 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); } }

Código de muestra

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(); } } } }


use el control HTML con un atributo runat server

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

Luego, en asp.net Codebehind

FileInput.PostedFile.SaveAs("DestinationPath");

También hay opciones de 3''rd party que mostrarán el progreso si se interesa



//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();