A enviar os ficheiros para ASP.net sem usar o controlo do servidor de carregamento

Como posso conseguir um ASP.net formulário web (v3.5) para postar um arquivo usando um antigo <input type="file" />?

não estou interessado em usar o ASP.net controlo do servidor de carregamento do ficheiro.

Obrigado pelas suas sugestões.

Author: Ronnie Overby, 2009-02-20

10 answers

No seu 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>

Em código atrás de:

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)));
    }
}
 125
Author: mathieu, 2012-06-18 19:42:23

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

Client side HTML code:

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

Método de envio de 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
    }
}
 38
Author: Aycan Yaşıt, 2015-09-22 09:26:52

Terá de definir o atributo {[[0]} do form para multipart/form-data; então você pode acessar o arquivo carregado usando a coleção HttpRequest.Files.

 22
Author: csgero, 2013-08-26 10:35:53

Usar o controlo HTML com um atributo runat server

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

Então em asp.net Codebehind

 FileInput.PostedFile.SaveAs("DestinationPath");

Existem também algumas opções 3'rd party que irão mostrar progresso se você intreded

 9
Author: cgreeno, 2009-02-20 14:01:17
Sim, pode achá-lo pelo método ajax post. no lado do servidor você pode usar httphandler. Portanto, não estamos usando nenhum controle de servidor de acordo com sua exigência.

Com o ajax também pode mostrar o progresso do upload.

Terá de ler o ficheiro como um fluxo interno.

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 Da 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();
                }
            }
        }
    }
 7
Author: Samuel Joy, 2016-03-26 15:08:52
O Pedido.A colecção de ficheiros contém todos os ficheiros enviados com o seu formulário, independentemente de terem vindo de um controlo de ficheiros ou de um <input type="file"> escrito manualmente.

Então você pode apenas escrever uma etiqueta de entrada de arquivo no meio da sua WebForm, e então ler o arquivo carregado a partir do pedido.Colecção de ficheiros.

 4
Author: David, 2009-02-20 13:43:01
Como outros têm resposta, o pedido.Os ficheiros são uma colecção de HttpFileCollection que contém todos os ficheiros que foram publicados, só precisa de perguntar esse objecto para o ficheiro como este:
Request.Files["myFile"]

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

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

Do lado do servidor o pedido de código anterior.Files ["myFile"] só devolve um objecto HttpPostedFile em vez dos dois ficheiros. Eu vi no. net 4.5 um método de extensão chamado GetMultiple, mas para versões prevóias, não existe, por isso proponho o método de extensão 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 extensão irá devolver todos os objectos de ficheiro Httppposted que tenham o nome "myFiles" na colecção HttpFileCollection, se existirem.

 3
Author: Joey O, 2015-05-20 21:33:10

Controlo do ficheiro Htmlinput

Estou sempre a usar isto.
 2
Author: Lurker Indeed, 2009-02-20 13:36:31
Aqui está um artigo do projeto de código com um projeto transferível que pretende resolver isso. Disclaimer: eu não testei este código. http://www.codeproject.com/KB/aspnet/fileupload.aspx
 1
Author: Bork Blatt, 2009-02-20 13:37:42
//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
Author: Jean Pierre Yenque, 2016-05-31 03:14:38