2009-02-20 30 views

Respuesta

121

En su 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))); 
    } 
} 
+3

@mathieu, lástima que su variante sí utiliza 'runat =" server "', no es independiente de las cosas del servidor de ASP.NET – Secret

+0

¿qué pasa si hay más de 1 entrada y desea funciones separadas realizadas con ambos conjuntos de archivos. –

+0

al usarlo para cargar varios archivos, devuelve el mismo nombre de archivo para todos los archivos y, por lo tanto, guarda el primer archivo n número de veces. ¿Alguna idea de cómo superarlo? – sohaiby

2

HtmlInputFile control

He usado esto todo el tiempo.

+1

que requiere la adición de 'runat = "server"' que se convierte esencialmente en un control de servidor, que no querían usar. – ahwm

8

usar el control HTML con un atributo runat servidor

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

Luego, en Codebehind asp.net

FileInput.PostedFile.SaveAs("DestinationPath"); 

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

+2

Nuevamente, eso lo está convirtiendo en un control de servidor. ;) – ahwm

21

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

+0

Mi formulario de servidor estaba en una página maestra y no pude agregar multipart/form-data (ya que entonces estaría en cada página). Una solución rápida y sucia fue agregar un control FileUpload oculto a la página. WebForms luego agregó los datos multipart/form-data automáticamente. Tuve que hacer esto porque estaba usando una entrada de archivo con Angular2 y no podía usar un control de servidor en una plantilla de componente. – Jason

4

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

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

36

Aquí es una solución sin depender de ningún tipo de control del lado del servidor, al igual que la OP ha descrito en la pregunta.

cliente código HTML lado:

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

método Page_Load de upload.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 
    } 
} 
+0

¡Genial, esto también solucionó mi problema! – Etienne

+0

Tenga cuidado con la llamada HTTPWebRequest que envía la ruta completa del archivo en MyFile.FileName. WebClient call solo envía el nombre del archivo. HTTPWebRequest hará que MyFile.SaveAs falle. Solo perdí horas persiguiendo a un cliente trabajando y un cliente no. –

6

Sí se puede achive esto mediante el método POST 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 puede mostrar el progreso de la carga.

tendrá que leer el archivo como un 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 ejemplo

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

Tal vez debería agregar la sugerencia para agregar un '' 'fs.close()' '' todo lo demás podría terminar en archivos ilegibles ya que permanecen de alguna manera abiertos dentro de IIS. – mistapink

3

Como otros tienen respuesta, los Request.Files es un HttpFileCollection que contiene todos los archivos que fueron publicadas, sólo tiene que pedir ese objeto para el archivo de la siguiente manera:

Request.Files["myFile"] 

¿Pero qué sucede cuando hay más de una entrada de marcado 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 versiones prevoious que no existe, para el caso i proponer 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 que tienen HttpPostedFile el nombre "misArchivos" en HttpFileCollection si existe alguno.

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

Use el botón '{}' para formatear su publicación. En este momento se ve texto basura. – Raju

Cuestiones relacionadas