web-dev-qa-db-fra.com

Téléchargement de fichiers dans ASP.net sans utiliser le contrôle de serveur FileUpload

Comment puis-je obtenir un formulaire Web ASP.net (v3.5) pour publier un fichier à l'aide d'un ancien <input type="file" />?

L'utilisation du contrôle serveur ASP.net FileUpload ne m'intéresse pas.

Merci pour vos suggestions.

94
Ronnie Overby

Dans votre 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>

Dans le code derrière:

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

Voici une solution qui ne repose sur aucun contrôle côté serveur, tout comme l’OP a décrit la question.

Code HTML côté client:

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

Méthode 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
    }
}
38
Aycan Yaşıt

Vous devez définir l'attribut enctype de form sur multipart/form-data; Vous pourrez alors accéder au fichier téléchargé à l'aide de la collection HttpRequest.Files.

22
csgero

utiliser le contrôle HTML avec un attribut de serveur runat

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

Puis dans asp.net Codebehind

 FileInput.PostedFile.SaveAs("DestinationPath");

Il y a aussi quelques 3ème partie options qui montreront les progrès si vous êtes intéressé

9
cgreeno

Oui, vous pouvez y parvenir par la méthode du message ajax. côté serveur, vous pouvez utiliser httphandler . Nous n'utilisons donc aucun contrôle serveur selon vos besoins.

avec ajax, vous pouvez également afficher la progression du téléchargement.

vous devrez lire le fichier en tant que flux d'entrée.

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

Exemple de code

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

La collection Request.Files contient tous les fichiers téléchargés avec votre formulaire, qu'ils proviennent d'un contrôle FileUpload ou d'un <input type="file"> écrit manuellement. 

Ainsi, vous pouvez simplement écrire une vieille balise d’entrée de fichier au milieu de votre formulaire Web, puis lire le fichier téléchargé à partir de la collection Request.Files.

4
David

Comme les autres ont une réponse, Request.Files est un HttpFileCollection qui contient tous les fichiers postés.

Request.Files["myFile"]

Mais que se passe-t-il quand il y a plus d'une balise d'entrée avec le même nom d'attribut:

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

Du côté serveur, le code précédent, Request.Files ["myFile"], ne renvoie qu'un seul objet HttpPostedFile au lieu des deux fichiers. J'ai vu sur .net 4.5 une méthode d'extension appelée GetMultiple, mais pour les versions précédentes, elle n'existe pas. Je propose d'ailleurs la méthode d'extension comme suit:

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

Cette méthode d'extension renverra tous les objets HttpPostedFile portant le nom "myFiles" dans HttpFileCollection, s'il en existe.

3
Joey O

Contrôle HtmlInputFile

Je l'ai utilisé tout le temps.

2
Lurker Indeed

Voici un article de Code Project avec un projet téléchargeable qui prétend résoudre ce problème. Disclaimer: Je n'ai pas testé ce code . 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