Redazione
a- a+

Upload file in ASP.NET

Vediamo come fare l'upload di file con ASP.NET in modo facile e veloce. Codici ed esempi.

L’upload di file tramite pagine ASP era una impresa da fatica di Ercole, tra l’altro erano nati componenti appositi (COM) per permettere l’upload dei file su dei server Web. Con ASP.NET tutto si è notevolmente semplificato e non c’è più bisogno di ricorrere a componenti di terze parti.

In questo articolo non solo vedremo come realizzare un modulo di upload immagini, ma lo renderemo intelligente, cioè in grado di riconoscere se l’immagine che stiamo caricando è una JPEG o no, se c’è già un file con lo stesso nome e in tal caso rinominarlo in maniera automatica in modo da evitare di sovrascriverlo e infine creare anche una thumbnail (miniaturizzazione dell’immagine) oltre a caricare l’immagine.

Prima di tutto apriamo un nuovo progetto per la nostra applicazione, aggiungiamo un campo File dagli HTML Control convertendolo in tipo server con la keyword: runat=”server” e lo nominiamo “imgUpload”.

<form id="Up" enctype="multipart/form-data" method="post" runat="server">
<input type="file" runat="server" id=" imgUpload”>
<asp:Button Runat="server" ID="Send" Text="Invia" name=”Invia”/>
</form>

Nel tag form utilizziamo l’attributo:

enctype="multipart/form-data"

E infine inseriamo un tasto HTML control nominandolo “Invia”.

L’esempio  visualizzerà una pagina con un textbox che conterrà il path del file e un pulsante "Sfoglia" o "Browse" per aprire la finestra di ricerca file.

Inoltre di fianco al tasto Sfoglia metteremo il pulsante "Invia" che effettuerà il submit del Form. Nella pagina e sopra l’oggetto “ImgUpload” inseriamo un oggetto Image che nomineremo “imgAnteprima” fissando le dimensioni larghezza e altezza a 160x120 che servirà a visualizzare la thumbnail quando verrà creata. Infine utilizziamo un Label nominato “lblMsg” che visualizzerà eventuali messaggi di alert.

Passiamo ora al codice ASP.NET (C#) che viene associato all’evento Click del tasto “Invia”:

private void invia_Click(object sender, System.EventArgs e)
{
    // dichiarazione delle variabili
    string sSavePath;
    string sThumbExtension;
    int intThumbWidth;
    int intThumbHeight;

    //settaggio dei valori iniziali delle variabili
    sSavePath = "img/"; // nome della cartella dove verrà caricata l’imamgine
    sThumbExtension = "_thumb"; // suffisso che verrà aggiunto al nome della 
                                // thumbnail quando verrà creata
    intThumbWidth = 160; // imposto la larghezza della thumbnail che verrà creata
    intThumbHeight = 120; // imposto l’altezza della thumbnail che verrà creata

    // controllo che il campo file non sia vuoto
    if (imgUpload.PostedFile != null)
    {
        // controllo della dimensione del file che deve essere maggiore di 0
        HttpPostedFile myFile = imgUpload.PostedFile;
        int nFileLen = myFile.ContentLength;
        if (nFileLen == 0)
        {
            lblMsg.Text = "Nessun file caricato.";
            return;
        }

        // controllo estenzione file (deve essere .jpg)
        if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg")
        {
            lblMsg.Text = "Il file deve avere un estenzione .JPG";
            return;
        }

        // Lettura del contenuto del file
        byte[] myData = new Byte[nFileLen];
        myFile.InputStream.Read(myData,0,nFileLen);

        // Controllo che non esiste un file con lo stesso nome. Se esiste aggiunge
        // un numero incrementale
        string sFilename = System.IO.Path.GetFileName(myFile.FileName);
        int file_append = 0;
        while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
        {
            file_append++;
            sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                             + file_append.ToString() + ".jpg";
        }

        // Salvataggio su disco
        System.IO.FileStream newFile
                = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename), 
                                           System.IO.FileMode.Create);
        newFile.Write(myData,0, myData.Length);
        newFile.Close();

        // Controllo che il file non sia già aperto
        System.Drawing.Image.GetThumbnailImageAbort myCallBack = 
                       new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
        Bitmap myBitmap;
        try
        {
            myBitmap = new Bitmap(Server.MapPath(sSavePath + sFilename));

            // Creazione della thumbnail (miniaturizzazione)
            file_append = 0;
            string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                     + sThumbExtension + ".jpg";
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile)))
            {
                file_append++;
               sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +                                  file_append.ToString() + sThumbExtension + ".jpg";
            }

            // Salvataggio della thumbnail 
            System.Drawing.Image myThumbnail
                    = myBitmap.GetThumbnailImage(intThumbWidth, 
                                             intThumbHeight, myCallBack, IntPtr.Zero);
            myThumbnail.Save (Server.MapPath(sSavePath + sThumbFile));
            imgAnteprima.ImageUrl = sSavePath + sThumbFile;

            // Mostra messaggio di successo
            lblMsg.Text = "File caricato con successo e creazione della thumbnail!";

            // Liberazione della memoria allocata negli oggetti
            myThumbnail.Dispose();
            myBitmap.Dispose();
        }
        catch (ArgumentException errArgument)
        {
            // Messaggio di errore, il file non è un file JPEG valido
            lblMsg.Text = "Il file non era una imamgine JPEG valida.";
            System.IO.File.Delete(Server.MapPath(sSavePath + sFilename));
        }
    }
}
public bool ThumbnailCallback()
{
    return false;
}        

Nell’esempio le variabili vengono prima dichiarate e inizializzate con i valori di default in modo che non ci siano errori di eventuali variabili nulle.

// dichiarazione delle variabili
    string sSavePath;
    string sThumbExtension;
    int intThumbWidth;
    int intThumbHeight;

    //settaggio dei valori iniziali delle variabili
    sSavePath = "img/"; // nome della cartella dove verrà caricata l’imamgine
    sThumbExtension = "_thumb"; // suffisso che verrà aggiunto al nome della 
                                // thumbnail quando verrà creata
    intThumbWidth = 160; // imposto la larghezza della thumbnail che verrà creata
    intThumbHeight = 120; // imposto l’altezza della thumbnail che verrà creata

Quindi si passa al controllo sul file che stiamo caricando:

1)     È obbligatorio scegliere un file e questo file non deve avere dimensione nulla né estensione differente da .jpg:

// controllo che il campo file non sia vuoto
    if (imgUpload.PostedFile != null)
    {
        // controllo della dimensione del file che deve essere maggiore di 0
        HttpPostedFile myFile = imgUpload.PostedFile;
        int nFileLen = myFile.ContentLength;
        if (nFileLen == 0)
        {
            lblMsg.Text = "Nessun file caricato.";
            return;
        }

        // controllo estenzione file (deve essere .jpg)
        if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg")
        {
            lblMsg.Text = "Il file deve avere un estenzione .JPG";
            return;
        }

2)     Si deve controllare che nella cartella img dove vengono caricati i file non esista già un file con lo stesso nome. Se esiste il file viene salvato nella cartella img ma viene aggiunto un numero (incrementale intero positivo): in questo modo il file viene rinominato in automatico prima di essere salvato in modo che non ci sono problemi di sovrascrittura.

// Controllo che non esiste un file con lo stesso nome. Se esiste aggiunge
        // un numero incrementale
        string sFilename = System.IO.Path.GetFileName(myFile.FileName);
        int file_append = 0;
        while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
        {
            file_append++;
            sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                             + file_append.ToString() + ".jpg";
        }

        // Salvataggio su disco
        System.IO.FileStream newFile
                = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename), 
                                           System.IO.FileMode.Create);
        newFile.Write(myData,0, myData.Length);
        newFile.Close();

3)     Per leggere il contenuto del file che sto caricando utilizzo l’oggetto stream, dato che si tratta di file binari e non file di testo.

System.IO.FileStream newFile

4)     Infine passo a scrivere la thumbnail, ovvero l’immagine ridimensionata utilizzando le variabili per la thumbnail che sono state dichiarate e definite nella parte iniziale del codice:

// Salvataggio della thumbnail 
            System.Drawing.Image myThumbnail
                    = myBitmap.GetThumbnailImage(intThumbWidth, 
                                                intThumbHeight, myCallBack, IntPtr.Zero);

Larghezza thumbnail:

intThumbWidth = 160; // imposto la larghezza della thumbnail che verrà creata

Altezza thumbnail:

intThumbHeight = 120; // imposto l’altezza della thumbnail che verrà creata

Alla fine del codice distruggo gli oggetti utilizzati in modo da liberare la memoria allocata da essi e ottimizzare le prestazioni.

// Liberazione della memoria allocata negli oggetti
            myThumbnail.Dispose();
            myBitmap.Dispose();



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Marcello
Ti è piaciuto l'articolo?