Caricamento di file (VB)

di Scott Mitchell

Scarica il PDF

Informazioni su come consentire agli utenti di caricare file binari (ad esempio Word o documenti PDF) nel sito Web in cui possono essere archiviati nel file system del server o nel database.

Introduzione

Tutte le esercitazioni esaminate finora hanno lavorato esclusivamente con i dati di testo. Tuttavia, molte applicazioni dispongono di modelli di dati che acquisiscono dati di testo e binari. Un sito di incontri online potrebbe consentire agli utenti di caricare un'immagine da associare al proprio profilo. Un sito Web di reclutamento può consentire agli utenti di caricare il loro curriculum come documento Microsoft Word o PDF.

L'uso dei dati binari aggiunge un nuovo set di sfide. È necessario decidere come vengono archiviati i dati binari nell'applicazione. L'interfaccia usata per l'inserimento di nuovi record deve essere aggiornata per consentire all'utente di caricare un file dal computer e i passaggi aggiuntivi devono essere eseguiti per visualizzare o fornire un mezzo per scaricare i dati binari associati di un record. In questa esercitazione e i tre successivi verranno illustrati come ostacoli a queste sfide. Alla fine di queste esercitazioni verrà creata un'applicazione completamente funzionale che associa un'immagine e una brochure PDF a ogni categoria. In questa esercitazione particolare verranno esaminate diverse tecniche per l'archiviazione dei dati binari e si esaminerà come consentire agli utenti di caricare un file dal computer e di salvarlo nel file system del server Web.

Nota

I dati binari che fanno parte di un modello di dati dell'applicazione vengono talvolta definiti BLOB, un acronimo di Binary Large OBject. In queste esercitazioni ho scelto di usare i dati binari della terminologia, anche se il termine BLOB è sinonimo.

Passaggio 1: Creazione dell'uso delle pagine Web dei dati binari

Prima di iniziare a esplorare le sfide associate all'aggiunta del supporto per i dati binari, è prima di tutto necessario creare le pagine ASP.NET nel progetto del sito Web che sarà necessario per questa esercitazione e le tre successive. Iniziare aggiungendo una nuova cartella denominata BinaryData. Aggiungere quindi le pagine di ASP.NET seguenti a tale cartella, assicurandosi di associare ogni pagina alla Site.master pagina master:

  • Default.aspx
  • FileUpload.aspx
  • DisplayOrDownloadData.aspx
  • UploadInDetailsView.aspx
  • UpdatingAndDeleting.aspx

Aggiungere le pagine ASP.NET per le esercitazioni di Data-Related binarie

Figura 1: Aggiungere le pagine ASP.NET per le esercitazioni di Data-Related binarie

Come nelle altre cartelle, Default.aspx nella BinaryData cartella verranno elencate le esercitazioni nella relativa sezione. Tenere presente che il SectionLevelTutorialListing.ascx controllo utente fornisce questa funzionalità. Aggiungere quindi questo controllo utente a Default.aspx trascinandolo dalla Esplora soluzioni nella visualizzazione Progettazione della pagina.

Aggiungere il controllo utente SectionLevelTutorialListing.ascx a Default.aspx

Figura 2: Aggiungere il controllo utente a Default.aspx (Fare clic per visualizzare l'immagineSectionLevelTutorialListing.ascx full-size)

Infine, aggiungere queste pagine come voci al Web.sitemap file. In particolare, aggiungere il markup seguente dopo il miglioramento di GridView <siteMapNode>:

<siteMapNode 
    title="Working with Binary Data" 
    url="~/BinaryData/Default.aspx" 
    description="Extend the data model to include collecting binary data.">
    
    <siteMapNode 
        title="Uploading Files" 
        url="~/BinaryData/FileUpload.aspx" 
        description="Examine the different ways to store binary data on the 
                     web server and see how to accept uploaded files from users 
                     with the FileUpload control." />
    <siteMapNode 
        title="Display or Download Binary Data" 
        url="~/BinaryData/DisplayOrDownloadData.aspx" 
        description="Let users view or download the captured binary data." />
    <siteMapNode 
        title="Adding New Binary Data" 
        url="~/BinaryData/UploadInDetailsView.aspx" 
        description="Learn how to augment the inserting interface to 
                     include a FileUpload control." />
    <siteMapNode 
        title="Updating and Deleting Existing Binary Data" 
        url="~/BinaryData/UpdatingAndDeleting.aspx" 
        description="Learn how to update and delete existing binary data." />
</siteMapNode>

Dopo l'aggiornamento Web.sitemap, passare un momento per visualizzare il sito Web delle esercitazioni tramite un browser. Il menu a sinistra include ora elementi per l'esercitazione Utilizzo dei dati binari.

La mappa del sito include ora voci per l'esercitazione Sull'uso dei dati binari

Figura 3: La mappa del sito include ora le voci per l'uso delle esercitazioni sui dati binari

Passaggio 2: Decidere dove archiviare i dati binari

I dati binari associati al modello di dati dell'applicazione possono essere archiviati in una delle due posizioni: nel file system del server Web con un riferimento al file system archiviato nel database; o direttamente all'interno del database stesso (vedere la figura 4). Ogni approccio ha un proprio set di pro e con e merita una discussione più dettagliata.

I dati binari possono essere archiviati nel file system o direttamente nel database

Figura 4: i dati binari possono essere archiviati nel file system o direttamente nel database (fare clic per visualizzare l'immagine full-size)

Si supponga di voler estendere il database Northwind per associare un'immagine a ogni prodotto. Un'opzione consiste nell'archiviare questi file di immagine nel file system del server Web e registrare il percorso nella Products tabella. Con questo approccio, è possibile aggiungere una ImagePath colonna alla Products tabella di tipo varchar(200), forse. Quando un utente ha caricato un'immagine per Chai, tale immagine potrebbe essere archiviata nel file system del server Web in ~/Images/Tea.jpg, dove ~ rappresenta il percorso fisico dell'applicazione. Ovvero, se il sito Web è radicato nel percorso C:\Websites\Northwind\fisico , ~/Images/Tea.jpg sarebbe equivalente a C:\Websites\Northwind\Images\Tea.jpg. Dopo aver caricato il file di immagine, si aggiorna il record Chai nella Products tabella in modo che la relativa ImagePath colonna faccia riferimento al percorso della nuova immagine. È possibile usare ~/Images/Tea.jpg o solo Tea.jpg se abbiamo deciso che tutte le immagini del prodotto verranno inserite nella cartella dell'applicazione Images .

I principali vantaggi dell'archiviazione dei dati binari nel file system sono:

  • La facilità di implementazione come si vedrà brevemente, l'archiviazione e il recupero dei dati binari archiviati direttamente all'interno del database comportano un po'più di codice rispetto all'uso dei dati tramite il file system. Inoltre, per consentire a un utente di visualizzare o scaricare dati binari, è necessario presentare un URL a tali dati. Se i dati si trovano nel file system del server Web, l'URL è semplice. Se i dati vengono archiviati nel database, tuttavia, è necessario creare una pagina Web che recupererà e restituirà i dati dal database.
  • L'accesso più ampio ai dati binari potrebbe essere necessario che i dati binari siano accessibili ad altri servizi o applicazioni, quelli che non possono eseguire il pull dei dati dal database. Ad esempio, le immagini associate a ogni prodotto potrebbero essere disponibili anche per gli utenti tramite FTP, in questo caso si vuole archiviare i dati binari nel file system.
  • Prestazioni se i dati binari vengono archiviati nel file system, la domanda e la congestione di rete tra il server di database e il server Web saranno inferiori a se i dati binari vengono archiviati direttamente all'interno del database.

Lo svantaggio principale dell'archiviazione dei dati binari nel file system è che separa i dati dal database. Se un record viene eliminato dalla Products tabella, il file associato nel file system del server Web non viene eliminato automaticamente. È necessario scrivere codice aggiuntivo per eliminare il file o il file system diventerà incluttered con file inutilizzati e orfani. Inoltre, quando si esegue il backup del database, è necessario assicurarsi di eseguire backup dei dati binari associati nel file system, nonché. Lo spostamento del database in un altro sito o server comporta problemi simili.

In alternativa, i dati binari possono essere archiviati direttamente in un database Microsoft SQL Server 2005 creando una colonna di tipo varbinary. Analogamente ad altri tipi di dati a lunghezza variabile, è possibile specificare una lunghezza massima dei dati binari che possono essere mantenuti in questa colonna. Ad esempio, per riservare al massimo 5.000 byte usare varbinary(5000); varbinary(MAX) consente la dimensione massima di archiviazione, circa 2 GB.

Il vantaggio principale dell'archiviazione dei dati binari direttamente nel database è l'accoppiamento stretto tra i dati binari e il record di database. Ciò semplifica notevolmente le attività di amministrazione del database, ad esempio i backup o lo spostamento del database in un sito o in un server diverso. Inoltre, l'eliminazione di un record elimina automaticamente i dati binari corrispondenti. Esistono anche vantaggi più sottili dell'archiviazione dei dati binari nel database.

Nota

In Microsoft SQL Server 2000 e versioni precedenti, il varbinary tipo di dati ha un limite massimo di 8.000 byte. Per archiviare fino a 2 GB di dati binari, è necessario usare invece il image tipo di dati . Con l'aggiunta di in SQL Server 2005, tuttavia, il image tipo di MAX dati è stato deprecato. È ancora supportato per la compatibilità con le versioni precedenti, ma Microsoft ha annunciato che il image tipo di dati verrà rimosso in una versione futura di SQL Server.

Se si usa un modello di dati meno recente, è possibile che venga visualizzato il image tipo di dati. La tabella del Categories database Northwind include una Picture colonna che può essere usata per archiviare i dati binari di un file di immagine per la categoria. Poiché il database Northwind ha le sue radici in Microsoft Access e versioni precedenti di SQL Server, questa colonna è di tipo image.

Per questa esercitazione e le tre successive verranno usati entrambi gli approcci. La Categories tabella ha già una Picture colonna per archiviare il contenuto binario di un'immagine per la categoria. Si aggiungerà una colonna aggiuntiva, BrochurePath, per archiviare un percorso a un PDF nel file system del server Web che può essere usato per fornire una panoramica di qualità di stampa, lucidata della categoria.

Passaggio 3: Aggiunta dellaBrochurePathCategoriescolonna alla tabella

Attualmente la tabella Categorie include solo quattro colonne: CategoryID, CategoryName, Descriptione Picture. Oltre a questi campi, è necessario aggiungere un nuovo oggetto che punta alla brochure della categoria (se presente). Per aggiungere questa colonna, passare a Esplora server, eseguire il drill-down nelle tabelle, fare clic con il pulsante destro del mouse sulla Categories tabella e scegliere Apri definizione tabella (vedere La figura 5). Se esplora server non viene visualizzato, visualizzarlo selezionando l'opzione Esplora server dal menu Visualizza oppure premere CTRL+ALT+S.

Aggiungere una nuova varchar(200) colonna alla Categories tabella denominata BrochurePath e consente NULL di fare clic sull'icona Salva (o premere CTRL+S).

Aggiungere una colonna BrochurePath alla tabella Categorie

Figura 5: Aggiungere una colonna alla tabella (fare clic per visualizzare l'immagineBrochurePathCategories full-size)

Passaggio 4: Aggiornamento dell'architettura per l'uso dellePicturecolonne eBrochurePath

In CategoriesDataTable Data Access Layer (DAL) sono attualmente definiti quattro DataColumn s: CategoryID, CategoryName, Descriptione NumberOfProducts. Quando è stata originariamente progettata questa tabella dati nell'esercitazione Creazione di un livello di accesso ai dati , la CategoriesDataTableNumberOfProducts colonna è stata aggiunta nell'esercitazione Master/Detail Usando un elenco puntato di record master con un'esercitazione Details DataList .

Come illustrato in Creazione di un livello di accesso ai dati, le tabelle dati nell'oggetto DataSet tipizzato costituiscono gli oggetti business. TableAdapters è responsabile della comunicazione con il database e della compilazione degli oggetti business con i risultati della query. L'oggetto CategoriesDataTableCategoriesTableAdapterviene popolato da , con tre metodi di recupero dei dati:

  • GetCategories() esegue la query principale di TableAdapter e restituisce i CategoryIDcampi , CategoryNamee Description di tutti i record nella Categories tabella. La query principale è ciò che viene usato dai metodi e Update generati Insert automaticamente.
  • GetCategoryByCategoryID(categoryID) restituisce i CategoryIDcampi , CategoryNamee Description della categoria i cui CategoryID valori sono uguali a categoryID.
  • GetCategoriesAndNumberOfProducts() - restituisce i CategoryIDcampi , CategoryNamee Description per tutti i record nella Categories tabella. Usa anche una sottoquery per restituire il numero di prodotti associati a ogni categoria.

Si noti che nessuna di queste query restituisce la Categories tabella s Picture o BrochurePath le colonne, né fornisce DataColumnCategoriesDataTable per questi campi. Per usare le proprietà Picture e BrochurePath , è necessario prima aggiungerle a CategoriesDataTable e quindi aggiornare la CategoriesTableAdapter classe per restituire queste colonne.

Aggiunta diPictureeBrochurePath``DataColumn

Per iniziare, aggiungere queste due colonne all'oggetto CategoriesDataTable. Fare clic con il pulsante destro del mouse sull'intestazione CategoriesDataTable s, scegliere Aggiungi dal menu di scelta rapida e quindi scegliere l'opzione Colonna. Verrà creato un nuovo DataColumn oggetto nella tabella DataTable denominata Column1. Rinominare questa colonna in Picture. Dal Finestra Proprietà impostare la DataColumn proprietà s DataType su System.Byte[] (questa non è un'opzione nell'elenco a discesa; è necessario digitarla).

Creare un'immagine denominata DataColumn il cui tipo di dati è System.Byte[]

Figura 6: Creare un DataColumn oggetto Denominato Picture il cui DataType è System.Byte[] (fare clic per visualizzare l'immagine a dimensione intera)

Aggiungere un altro DataColumn elemento alla tabella DataTable, assegnando un BrochurePath nome usando il valore predefinito DataType (System.String).

Restituzione deiPicturevalori eBrochurePathda TableAdapter

Con questi due DataColumn elementi aggiunti a CategoriesDataTable, si è pronti per aggiornare .CategoriesTableAdapter È possibile che entrambi questi valori di colonna vengano restituiti nella query TableAdapter principale, ma in questo modo vengono restituiti i dati binari ogni volta che il GetCategories() metodo è stato richiamato. Aggiornare invece la query TableAdapter principale per ripristinare BrochurePath e creare un metodo di recupero dati aggiuntivo che restituisca una determinata colonna di Picture categoria.

Per aggiornare la query TableAdapter principale, fare clic con il pulsante destro del mouse sull'intestazione CategoriesTableAdapter s e scegliere l'opzione Configura dal menu di scelta rapida. Verrà visualizzata la Configurazione guidata adattatore tabelle, che è stata descritta in diverse esercitazioni precedenti. Aggiornare la query per ripristinare e BrochurePath fare clic su Fine.

Aggiornare l'elenco di colonne nell'istruzione SELECT per restituire anche BrochurePath

Figura 7: Aggiornare l'elenco di colonne nell'istruzione SELECT in modo che restituisca BrochurePath anche (fare clic per visualizzare l'immagine a dimensione intera)

Quando si usano istruzioni SQL ad hoc per TableAdapter, l'aggiornamento dell'elenco di colonne nella query principale aggiorna l'elenco di colonne per tutti i SELECT metodi di query in TableAdapter. Ciò significa che il GetCategoryByCategoryID(categoryID) metodo è stato aggiornato per restituire la BrochurePath colonna, che potrebbe essere ciò che si intendeva. Tuttavia, ha aggiornato anche l'elenco di colonne nel GetCategoriesAndNumberOfProducts() metodo, rimuovendo la sottoquery che restituisce il numero di prodotti per ogni categoria. Pertanto, è necessario aggiornare la query di SELECT questo metodo. Fare clic con il pulsante destro del GetCategoriesAndNumberOfProducts() mouse sul metodo, scegliere Configura e ripristinare il valore originale della SELECT query:

SELECT CategoryID, CategoryName, Description, 
       (SELECT COUNT(*) 
            FROM Products p 
            WHERE p.CategoryID = c.CategoryID) 
       as NumberOfProducts
FROM Categories c

Creare quindi un nuovo metodo TableAdapter che restituisca un valore di colonna della Picture categoria specifica. Fare clic con il pulsante destro del mouse sull'intestazione CategoriesTableAdapter s e scegliere l'opzione Aggiungi query per avviare la Configurazione guidata query TableAdapter. Il primo passaggio di questa procedura guidata chiede se si vogliono eseguire query sui dati usando un'istruzione SQL ad hoc, una nuova stored procedure o una esistente. Selezionare Usa istruzioni SQL e fare clic su Avanti. Poiché verrà restituita una riga, scegliere l'opzione SELECT che restituisce le righe dal secondo passaggio.

Selezionare l'opzione Usa istruzioni SQL

Figura 8: Selezionare l'opzione Usa istruzioni SQL (fare clic per visualizzare l'immagine a dimensione intera)

Poiché la query restituirà un record dalla tabella Categorie, scegliere SELECT che restituisce righe

Figura 9: Poiché la query restituirà un record dalla tabella Categorie, scegliere SELECT che restituisce le righe (fare clic per visualizzare l'immagine a dimensione intera)

Nel terzo passaggio immettere la query SQL seguente e fare clic su Avanti:

SELECT     CategoryID, CategoryName, Description, BrochurePath, Picture
FROM       Categories
WHERE      CategoryID = @CategoryID

L'ultimo passaggio consiste nel scegliere il nome per il nuovo metodo. Usare FillCategoryWithBinaryDataByCategoryID e GetCategoryWithBinaryDataByCategoryID per compilare una tabella DataTable e restituire rispettivamente un modello DataTable. Fare clic su Fine per completare la procedura guidata.

Scegliere i nomi per i metodi di TableAdapter

Figura 10: Scegliere i nomi per i metodi di TableAdapter (fare clic per visualizzare l'immagine a dimensione intera)

Nota

Dopo aver completato la Configurazione guidata query dell'adattatore tabelle, è possibile che venga visualizzata una finestra di dialogo che informa che il nuovo testo del comando restituisce dati con schema diverso dallo schema della query principale. In breve, la procedura guidata nota che la query GetCategories() principale di TableAdapter restituisce uno schema diverso da quello appena creato. Ma questo è ciò che vogliamo, quindi si può ignorare questo messaggio.

Tenere inoltre presente che se si usano istruzioni SQL ad hoc e si usa la procedura guidata per modificare la query principale di TableAdapter in un secondo momento, l'elenco di colonne dell'istruzione del SELECT metodo verrà modificato GetCategoryWithBinaryDataByCategoryID in modo da includere solo le colonne della query principale, ovvero rimuoverà la Picture colonna dalla query. Sarà necessario aggiornare manualmente l'elenco di colonne per restituire la Picture colonna, in modo analogo a quanto fatto in precedenza con il GetCategoriesAndNumberOfProducts() metodo in questo passaggio.

Dopo aver aggiunto i due DataColumn al CategoriesDataTable e al GetCategoryWithBinaryDataByCategoryID metodo a CategoriesTableAdapter, queste classi nel dataset tipizzato Designer dovrebbero essere simili alla schermata nella figura 11.

Il set di dati Designer include le nuove colonne e il metodo

Figura 11: Il set di dati Designer include le nuove colonne e il metodo

Aggiornamento del livello della logica di business (BLL)

Con l'aggiornamento dal, tutto ciò che rimane consiste nell'aumentare il livello BLL (Business Logic Layer) per includere un metodo per il nuovo CategoriesTableAdapter metodo. Aggiungere il metodo seguente alla classe CategoriesBLL:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetCategoryWithBinaryDataByCategoryID(categoryID As Integer) _
    As Northwind.CategoriesDataTable
    
    Return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID)
End Function

Passaggio 5: Caricamento di un file dal client al server Web

Quando si raccolgono dati binari, spesso questi dati vengono forniti da un utente finale. Per acquisire queste informazioni, l'utente deve essere in grado di caricare un file dal computer al server Web. I dati caricati devono quindi essere integrati con il modello di dati, che può significare salvare il file nel file system del server Web e aggiungere un percorso al file nel database o scrivere il contenuto binario direttamente nel database. In questo passaggio verrà illustrato come consentire a un utente di caricare file dal computer al server. Nell'esercitazione successiva verrà rivolta l'attenzione all'integrazione del file caricato con il modello di dati.

ASP.NET 2.0 nuovo controllo Web FileUpload fornisce un meccanismo che consente agli utenti di inviare un file dal computer al server Web. Il controllo FileUpload esegue il rendering come elemento <input> il cui type attributo è impostato su file, che i browser visualizzano come casella di testo con un pulsante Sfoglia. Facendo clic sul pulsante Sfoglia viene visualizzata una finestra di dialogo da cui l'utente può selezionare un file. Quando il modulo viene inviato di nuovo, il contenuto del file selezionato viene inviato insieme al postback. Sul lato server, le informazioni sul file caricato sono accessibili tramite le proprietà del controllo FileUpload.

Per illustrare il caricamento dei file, aprire la FileUpload.aspx pagina nella BinaryData cartella , trascinare un controllo FileUpload dalla casella degli strumenti nella Designer e impostare la proprietà del controllo su IDUploadTest. Aggiungere quindi un controllo Web Button impostandone le ID proprietà e Text rispettivamente su UploadButton e Carica file selezionato. Infine, posizionare un controllo Web Etichetta sotto Il pulsante, cancellarne Text la proprietà e impostarne la ID proprietà su UploadDetails.

Aggiungere un controllo FileUpload alla pagina ASP.NET

Figura 12: Aggiungere un controllo FileUpload alla pagina ASP.NET (fare clic per visualizzare l'immagine a dimensione intera)

La figura 13 mostra questa pagina quando viene visualizzata tramite un browser. Si noti che facendo clic sul pulsante Sfoglia viene visualizzata una finestra di dialogo di selezione file, consentendo all'utente di selezionare un file dal computer. Dopo aver selezionato un file, facendo clic sul pulsante Carica file selezionato viene generato un postback che invia il contenuto binario del file selezionato al server Web.

L'utente può selezionare un file da caricare dal computer al server

Figura 13: L'utente può selezionare un file da caricare dal computer al server (fare clic per visualizzare l'immagine a dimensione intera)

Al postback, il file caricato può essere salvato nel file system o i relativi dati binari possono essere usati direttamente tramite un Stream. Per questo esempio, è possibile creare una ~/Brochures cartella e salvare il file caricato. Per iniziare, aggiungere la Brochures cartella al sito come sottocartella della directory radice. Creare quindi un gestore eventi per l'evento UploadButton s Click e aggiungere il codice seguente:

Protected Sub UploadButton_Click(sender As Object, e As EventArgs) _
    Handles UploadButton.Click
    
    If UploadTest.HasFile = False Then
        ' No file uploaded!
        UploadDetails.Text = "Please first select a file to upload..."
    Else
        ' Display the uploaded file's details
        UploadDetails.Text = String.Format( _
                "Uploaded file: {0}<br />" & _
                "File size (in bytes): {1:N0}<br />" & _
                "Content-type: {2}", _
                UploadTest.FileName, _
                UploadTest.FileBytes.Length, _
                UploadTest.PostedFile.ContentType)
        ' Save the file
        Dim filePath As String = _
            Server.MapPath("~/Brochures/" & UploadTest.FileName)
        UploadTest.SaveAs(filePath)
    End If
End Sub

Il controllo FileUpload offre un'ampia gamma di proprietà per l'uso dei dati caricati. Ad esempio, la HasFile proprietà indica se un file è stato caricato dall'utente, mentre la FileBytes proprietà fornisce l'accesso ai dati binari caricati come matrice di byte. Il Click gestore eventi inizia assicurandosi che sia stato caricato un file. Se è stato caricato un file, l'etichetta mostra il nome del file caricato, le dimensioni in byte e il tipo di contenuto.

Nota

Per assicurarsi che l'utente carichi un file, è possibile controllare la HasFile proprietà e visualizzare un avviso se è Falseoppure è possibile usare il controllo RequiredFieldValidator .

FileUpload SaveAs(filePath) salva il file caricato nel filePath specificato. filePath deve essere un percorso fisico (C:\Websites\Brochures\SomeFile.pdf) anziché un percorso virtuale (/Brochures/SomeFile.pdf). Il Server.MapPath(virtPath) metodo accetta un percorso virtuale e restituisce il percorso fisico corrispondente. In questo caso, il percorso virtuale è ~/Brochures/fileName, dove fileName è il nome del file caricato. Per altre informazioni sui percorsi virtuali e fisici e sull'uso Server.MapPathdi , vedere Server.MapPath Methos.

Dopo aver completato il Click gestore eventi, provare la pagina in un browser. Fare clic sul pulsante Sfoglia e selezionare un file dal disco rigido e quindi fare clic sul pulsante Carica file selezionato. Il postback invierà il contenuto del file selezionato al server Web, che visualizzerà quindi le informazioni sul file prima di salvarlo nella ~/Brochures cartella. Dopo aver caricato il file, tornare a Visual Studio e fare clic sul pulsante Aggiorna nella Esplora soluzioni. Dovrebbe essere visualizzato il file appena caricato nella cartella ~/Brochures!

Il file EvolutionValley.jpg è stato caricato nel server Web

Figura 14: Il file EvolutionValley.jpg è stato caricato nel server Web (fare clic per visualizzare l'immagine a dimensione intera)

EvolutionValley.jpg è stato salvato nella cartella ~/Brochures

Figura 15: EvolutionValley.jpg Salvato nella ~/Brochures cartella

Sottigliezze con il salvataggio di file caricati nel file system

Quando si salvano file nel file system del server Web, è necessario risolvere diverse sottigliezze. In primo luogo, c'è il problema della sicurezza. Per salvare un file nel file system, il contesto di sicurezza in cui viene eseguita la pagina ASP.NET deve disporre delle autorizzazioni di scrittura. Il server Web di sviluppo ASP.NET viene eseguito nel contesto dell'account utente corrente. Se si usa Internet Information Services (IIS) di Microsoft come server Web, il contesto di sicurezza dipende dalla versione di IIS e dalla relativa configurazione.

Un'altra sfida per salvare i file nel file system ruota attorno alla denominazione dei file. Attualmente, la pagina salva tutti i file caricati nella ~/Brochures directory usando lo stesso nome del file nel computer del client. Se User A carica una brochure con il nome Brochure.pdf, il file verrà salvato come ~/Brochure/Brochure.pdf. Ma cosa succede se in un secondo momento l'utente B carica un file di brochure diverso che ha lo stesso nome file (Brochure.pdf)? Con il codice ora disponibile, il file di User A verrà sovrascritto con il caricamento di User B.

Esistono numerose tecniche per la risoluzione dei conflitti di nome file. Un'opzione consiste nel impedire il caricamento di un file se esiste già uno con lo stesso nome. Con questo approccio, quando l'utente B tenta di caricare un file denominato Brochure.pdf, il sistema non salva il file e visualizza un messaggio che informa l'utente B di rinominare il file e riprovare. Un altro approccio consiste nel salvare il file usando un nome di file univoco univoco univoco (GUID) globale o il valore delle colonne chiave primaria del record di database corrispondenti (presupponendo che il caricamento sia associato a una determinata riga nel modello di dati). Nell'esercitazione successiva verranno esaminate queste opzioni in modo più dettagliato.

Sfide coinvolte con grandi quantità di dati binari

Queste esercitazioni presuppongono che i dati binari acquisiti siano modesti in dimensioni. L'uso di grandi quantità di file di dati binari che sono diversi megabyte o più grandi introduce nuove sfide oltre l'ambito di queste esercitazioni. Ad esempio, per impostazione predefinita, ASP.NET rifiuterà i caricamenti di più di 4 MB, anche se questa operazione può essere configurata tramite l'elemento<httpRuntime> in Web.config. IIS impone anche le limitazioni relative alle dimensioni di caricamento dei file. Inoltre, il tempo necessario per caricare file di grandi dimensioni potrebbe superare i 110 secondi predefiniti ASP.NET attenderà una richiesta. Esistono anche problemi di memoria e prestazioni che si verificano quando si utilizzano file di grandi dimensioni.

Il controllo FileUpload è impraticabile per i caricamenti di file di grandi dimensioni. Poiché il contenuto del file viene pubblicato nel server, l'utente finale deve attendere pazientemente senza confermare che il caricamento è in corso. Questo non è un problema tanto quando si tratta di file più piccoli che possono essere caricati in pochi secondi, ma può essere un problema quando si gestiscono file di dimensioni maggiori che potrebbero richiedere minuti per il caricamento. Esistono diversi controlli di caricamento di file di terze parti più adatti per la gestione di caricamenti di grandi dimensioni e molti di questi fornitori forniscono indicatori di avanzamento e manager di caricamento ActiveX che presentano un'esperienza utente molto più lucida.

Se l'applicazione deve gestire file di grandi dimensioni, è necessario analizzare attentamente le sfide e trovare soluzioni appropriate per le esigenze specifiche.

Riepilogo

La creazione di un'applicazione che deve acquisire i dati binari presenta numerose sfide. In questa esercitazione sono state esaminate le prime due: decidere dove archiviare i dati binari e consentire a un utente di caricare contenuto binario tramite una pagina Web. Nelle tre esercitazioni successive verrà illustrato come associare i dati caricati a un record nel database e come visualizzare i dati binari insieme ai relativi campi dati di testo.

Programmazione felice!

Altre informazioni

Per altre informazioni sugli argomenti illustrati in questa esercitazione, vedere le risorse seguenti:

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato con le tecnologie Microsoft Web dal 1998. Scott lavora come consulente indipendente, allenatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2,0 in 24 Ore. Può essere raggiunto a mitchell@4GuysFromRolla.com. o tramite il suo blog, che può essere trovato in http://ScottOnWriting.NET.

Grazie speciali

Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali per questa esercitazione erano Teresa Murphy e Bernadette Leigh. Interessati a esaminare i prossimi articoli MSDN? In tal caso, lasciami una riga in mitchell@4GuysFromRolla.com.