Upload de arquivos no ASP.net sem usar o controle do servidor FileUpload

Como posso obter um formulário da web do asp.net (v3.5) para postar um arquivo usando um antigo ?

Não estou interessado em usar o controle do servidor ASP.net FileUpload.

Obrigado por suas sugestões.

    No seu aspx:

     

    No código por trá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))); } } 

    Aqui está uma solução sem depender de nenhum controle do lado do servidor, exatamente como o OP descreveu na pergunta.

    Código HTML do lado do cliente:

     

    Método de 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 } } 

    Você terá que definir o atributo enctype do form para multipart/form-data ; então você pode acessar o arquivo carregado usando a coleção HttpRequest.Files .

    use o controle HTML com um atributo do servidor runat

       

    Então no asp.net Codebehind

      FileInput.PostedFile.SaveAs("DestinationPath"); 

    Há também algumas opções de terceiros que mostrarão progresso se você tiver participado

    Sim, você pode conseguir isso pelo método ajax post. no lado do servidor, você pode usar o httphandler. Portanto, não estamos usando nenhum controle de servidor conforme sua necessidade.

    com ajax você pode mostrar o progresso do upload também.

    você terá que ler o arquivo como um stream de input.

     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 amostra

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

    A coleção Request.Files contém todos os arquivos carregados com o formulário, independentemente de terem sido provenientes de um controle FileUpload ou de um escrito manualmente.

    Assim, você pode simplesmente escrever uma tag de input de arquivo antiga no meio do seu WebForm e, em seguida, ler o arquivo carregado da coleção Request.Files.

    Como outros tem resposta, o Request.Files é um HttpFileCollection que contém todos os arquivos que foram postados, você só precisa perguntar a esse object para o arquivo como este:

     Request.Files["myFile"] 

    Mas o que acontece quando há mais de uma marcação de input com o mesmo nome de atributo:

     Select file 1  Select file 2  

    No lado do servidor, o código anterior Request.Files [“myFile”] retorna apenas um object HttpPostedFile em vez dos dois arquivos. Eu tenho visto no .net 4.5 um método de extensão chamado GetMultiple mas para versões anteriores ele não existe, para tanto eu proponho o método de extensão como:

     public static IEnumerable 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 extensão retornará todos os objects HttpPostedFile que possuem o nome "myFiles" no HttpFileCollection, se houver algum.

    Controle HtmlInputFile

    Eu usei isso o tempo todo.

    Aqui está um artigo do Projeto de Código com um projeto para download que pretende resolver isso. Isenção de responsabilidade: Eu não testei este código. 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();