it-swarm.com.de

Hochladen von Dateien in ASP.net ohne Verwendung des FileUpload-Serversteuerelements

Wie kann ich ein ASP.net-Webformular (v3.5) zum Veröffentlichen einer Datei mit einem einfachen alten <input type="file" /> erhalten?

Ich bin nicht daran interessiert, das ASP.net FileUpload-Serversteuerelement zu verwenden.

Danke für deine Vorschläge.

94
Ronnie Overby

In deinem 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>

Im Code hinter:

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

Hier ist eine Lösung, ohne auf eine serverseitige Steuerung angewiesen zu sein, genau wie OP in der Frage beschrieben hat.

Client-seitiger HTML-Code:

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

Methode "Laden" von 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
    }
}
38
Aycan Yaşıt

Sie müssen das enctype-Attribut der form auf multipart/form-data; Setzen. Dann können Sie mit der HttpRequest.Files-Sammlung auf die hochgeladene Datei zugreifen.

22
csgero

verwenden Sie das HTML-Steuerelement mit einem Runat-Serverattribut

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

Dann in asp.net Codebehind

 FileInput.PostedFile.SaveAs("DestinationPath");

Es gibt auch einige 3'rd Party - Optionen, die den Fortschritt anzeigen, wenn Sie interessiert sind

9
cgreeno

Ja, Sie können dies mit der Ajax-Post-Methode erreichen. Auf der Serverseite können Sie httphandler ..__ verwenden. Daher verwenden wir gemäß Ihren Anforderungen keine Serversteuerelemente.

mit Ajax können Sie auch den Upload-Fortschritt anzeigen.

sie müssen die Datei als Inputstream lesen.

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

Beispielcode

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
Samuel Joy

Die Request.Files-Auflistung enthält alle mit Ihrem Formular hochgeladenen Dateien, unabhängig davon, ob sie von einem FileUpload-Steuerelement oder einem manuell geschriebenen <input type="file"> stammen. 

Sie können also einfach ein einfaches altes Dateieingabe-Tag in die Mitte Ihres WebForm schreiben und dann die hochgeladene Datei aus der Request.Files-Auflistung lesen.

4
David

Da andere Benutzer die Antwort erhalten haben, handelt es sich bei Request.Files um eine HttpFileCollection, die alle Dateien enthält, die gepostet wurden. Sie müssen das Objekt nur wie folgt nach der Datei fragen:

Request.Files["myFile"]

Was passiert aber, wenn es mehr als eine Eingabe mit demselben Attributnamen gibt:

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

Auf dem Server gibt der vorherige Code Request.Files ["myFile"] nur ein HttpPostedFile-Objekt anstelle der beiden Dateien zurück. Ich habe auf .net 4.5 eine Erweiterungsmethode namens GetMultiple gesehen, die jedoch für frühere Versionen nicht existiert. Aus diesem Grund schlage ich die Erweiterungsmethode vor:

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

Diese Erweiterungsmethode gibt alle HttpPostedFile-Objekte mit dem Namen "myFiles" in der HttpFileCollection zurück, sofern vorhanden.

3
Joey O

HtmlInputFile-Steuerelement

Ich habe das die ganze Zeit benutzt.

2
Lurker Indeed

Hier ist ein Artikel zum Code-Projekt mit einem herunterladbaren Projekt, das dies zu lösen vorgibt. Haftungsausschluss: Ich habe diesen Code nicht getestet . http://www.codeproject.com/KB/aspnet/fileupload.aspx

1
Bork Blatt
//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