Il termine "Upload" indica l'operazione che un utente compie quando "trasferisce" un file, tramite il web, dal suo computer verso un server. è, quindi, l'operazione inversa del download, che indica lo scaricamento di un file da un server web sul computer dell'utente. Anche il protocollo HTTP supporta l'upload e, non da molto, anche il Web Server di Microsoft IIS.
Quindi per i programmatori ASP c'è la possibilità di utilizzare questa caratteristica. Ma, in realtà, le difficoltà non sono poche.
Come si fa?
Prima di tutto non sempre il server è "a casa nostra", ma è gestito da una socetà esterna in hosting (nela maggior parte dei casi) che difficilmente da' completo accesso allo stesso (restrizioni/sicurezza ecc... comprese), principalmente perchè si ha la necessità di avere una directory dove l'utente può depositare il file che sta uploadando. Questo perchè il processo del Web Server in esecuzione (che si occupa di gestire le richieste HTTP) è, generalmente, mandato in esecuzione con uno user (che generalmente ha il nome IUSR_nomecomputer con password non conosciuta) con i privilegi di NT al minimo per questioni di sicurezza. Tra i privilegi di accesso ad una cartella dal quale preleviamo una pagina HTML, per esempio, è poco raccomandato avere i privilegi in scrittura.
Quindi bisogna avere una apposita cartella dove vengano "caricati" i files e questa deve essere creata/gestita dalla società che manutiene il Web Server.
Il problema principale è che non esiste documentazione sul "come gestire" l'uploading via ASP. L'unica possibilità che abbiamo, quindi, è di utilizzare componenti di terze parti. Non che questo comporti un peggioramente delle prestazioni (anzi è il contrario) ma non sempre possiamo installare dei componenti su un server che non è nostro. Infatti alcune aziende danno completa libertà per l'utilizzo delle ASP (che non permette di fare dei "danni", anche perchè il codice è controllabile a vista) ma, per loro politica aziendale (molto corretta per'altro), non danno la possibilità di installare dei componenti da remoto.
Un altro fatto è che questi componenti sono delle "scatole chiuse" che ci permettono di fare quello che il programmatore ha previsto. Non sono, in generale, open source. La conclusione (nella maggior parte dei casi) è quella di avere una pagina ASP che permetta di fare "solo ed esclusivamente" l'upload di file, mentre, per il programmatore, sarebbe stato più comodo avere la possibilità di accedere sia al contenuto dei file che agli input field inviati con la richiesta tramite un form HTML: ad esempio con: request.form("uploadFile") si potrebbe avere il contenuto del file per poi salvarlo nella directory.
Per tutti questi motivi ci si trova nell'esigenza di creare un modulo ASP (da includere nelle pagine al momento in cui serve) che permetta tutto quello che abbiamo appena accennato.
Le basi
Partendo dalla documentazione ufficiale si legge che l'unico modo per accedere al contenuto del file uploadato è richiamare il metodo RequestBinary, nel seguente modo:
bytecount = Request.TotalBytes bytArray = Request.BinaryRead(bytecount)
Putroppo (altra carenza del linguaggio) VBScript non ha delle funzioni che convertono, in automatico, tutto un Array da byte a char (String), quindi si dovrebbe fare (in teoria) un ciclo su ogni elemento dell'array per creare una stringa di caratteri in questo modo:
For lngLoop = 0 To UBound(bytArray) - 1 strByteToString = strByteToString + Chr(bytArray(lngLoop)) Next
Questo loop potrebbe però rallentare molto il processo di uploading. L'unico escamottage che si potrebbe adottare, utilizzando le librerie standard di ADO è utilizzare il methodo "AppendChunk" dell'oggetto Field, che permette di "appendere" dati come ad un field di tipo long binary. Tuttavia, in questo contesto, viene utilizzato per essere, poi, restituito come stringa. Il tutto quindi si trasforma in:
Set rstTemp = Server.CreateObject("ADODB.Recordset") rstTemp.Fields.Append "bytArray", adLongVarChar, lenb(bytArray) rstTemp.Open rstTemp.AddNew rstTemp.Fields("bytArray").AppendChunk bytArray rstTemp.Update strByteToString = rstTemp("bytArray")
ottenendo nella variabile stringa strByteToString il contenuto serializzato della richiesta. A questo punto la richiesta è manipolabile con i metodi e le funzioni generalmente utilizzate, con VBScript (quali Mid e InStr).
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.