Su tutti i piani windows è disponibile la libreria AspSmartUpload, utile ad effettuare l'upload di file sul server. Qui di seguito sono riportati alcuni esempi di codice.
Errori frequenti:
Per poter funzionare correttamente, gli script di upload necessitano che la cartella di destinazione sia impostata con i permessi di scrittura.
Potete effettuare questa configurazione attraverso il vostro pannello di controllo, alla voce permessi cartelle e files
Assicuratevi che il percorso di destinazione dell'upload sia corretto e sia quindi all'interno del vostro spazio. Poiché l'oggetto AspSmartUpload lo consente, il consiglio è quello di indicare path virtuali a partire dalla root del vostro sito web, come riportato nell'esempio qui di seguito.
Upload misto di uno o più file e di un campo testo
Questo è un esempio per uno script completo che esegue l'upload di file sul server. Si suppone che sul sito esista la cartella con percorso virtuale /uploadtest e che su di essa siano stati configurati i permessi di scrittura attraverso il pannello di controllo.
upload.asp
<html>
<head>
<title>upload test page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<%
Dim myUpload
Dim intCount
if Request.Totalbytes > 0 then
On Error Resume Next
Set myUpload = Server.CreateObject("aspSmartUpload.SmartUpload")
myUpload.upload
'Esegue il caricamento dei file sul server
'********************************
For each file In myUpload.Files
If not file.IsMissing Then
file.SaveAs("/uploadtest/" & file.FileName)
end if
Next
' Intercetta gli errori
' ***********
If Err Then
Response.Write("<br><br><b>Selezione errata : </b>"
& Err.description & "<br><a href=""upload.asp"">riprova</a>")
Else
For each file In myUpload.Files
' Solo se il file esiste
' **********************
If not file.IsMissing Then
' mostra le proprietà del file caricato
' ******************************************
Response.Write("Name = " & file.Name & "<br>")
Response.Write("Size = " & file.Size & "<br>")
Response.Write("FileName = " & file.FileName & "<br>")
Response.Write("FileExt = " & file.FileExt & "<br>")
Response.Write("FilePathName = " & file.FilePathName & "<br>")
Response.Write("ContentType = " & file.ContentType & "<br>")
Response.Write("ContentDisp = " & file.ContentDisp & "<br>")
Response.Write("TypeMIME = " & file.TypeMIME & "<br>")
Response.Write("SubTypeMIME = " & file.SubTypeMIME & "<br>")
Response.Write("**************************<br><br>")
intCount = intCount + 1
End If
Next
Response.write("==========<br>" & myUpload.form("commenti"))
Response.Write(" <br><br>Upload di "
& intCount & " file eseguito correttamente.
<br><a href=""upload.asp"">nuovo upload</a>")
End If
set myUpload = nothing
Else
'HTML %>
<form method="post" action="upload.asp"
name="fileform" enctype="multipart/form-data">
<table width=400 border=0>
<tr>
<th>
commento
</th>
<td>
<textarea name="commenti" rows="3" cols="25"></textarea>
</td>
</tr>
<tr>
<th>
seleziona i file:
</th>
<td>
<input type="file" name="file1" size="15">
<input type="file" name="file2" size="15">
<input type="file" name="file3" size="15">
<br>
<input type="submit" value="invia" name="pulsante">
</td>
</tr>
</table>
</form>
<%
End if
%>
</body>
</html>
Nonostante lo script sia semplice, come tutti quelli riportati in queste guide in linea, offre comunque numerosi spunti interessanti. Il primo è il fatto che, poiché si sta utilizzando un form enctype="multipart/form-data", i campi del form non sono accessibili da ASP semplicemente con request("nome_del_campo").
Questo è già un problema quando si tratta di stabilire se sia stato effettuato il submit (e quindi sia necessario caricare i file sul server) oppure se si debba stampare a video il form per l'immissione dati. Una soluzione può essere quella di utilizzare la proprietà request.Totalbytes, che rappresenta la dimensione dei dati postati. Se è maggiore di zero, allora vi sono dei dati postati, quindi si procede all'upload.
L'upload viene effettuato sfruttando la collection File dell'oggetto SmartUpload. Non si tratta dell'unico sistema, ma copiando e incollando questo script potete modificare il numero di file da caricare sul server semplicemente aggiungendo o togliendo un campo input di tipo file nel form di immissione dati, senza toccare niente della parte ASP della pagina. Stesso dicasi per i campi testo del form.
Qui di seguito una breve descrizione delle caratteristiche e dei metodi dell'oggetto SmartUpload
Manuale in inglese: ASPSMARTUPLOAD : DOCUMENTATION
Supponiamo di aver istanziato l'oggetto myUpload, tramite Set myUpload = Server.CreateObject("AspSmartUpload.SmartUpload")
CodePage: imposta il code page per salvare il file con il corretto nome. Esempio: MyUpLoad.CodePage = "big5". Lista dei possibili code page
TotalMaxFileSize: imposta la dimensione massima del totale dei file caricati sul server. La dimensione è espressa in byte. Esempio: MyUpLoad.TotalMaxFileSize = 10000
Il valore di default è null, che significa che non vi è alcuna limitazione
MaxFileSize: imposta la dimensione massima di ciascun singolo file caricato sul server. La dimensione è espressa in byte. Esempio: MyUpLoad.MaxFileSize = 10000
Il valore di default è null, che significa che non vi è alcuna limitazione
AllowedFilesList: è una stringa contenente la lista delle estensioni di file consentite, separate da virgola. Esempio: MyUpLoad.AllowedFilesList = "zip,rar,ace"
Il valore di default è la stringa vuota, che significa che tutte le estensioni sono permesse. Se invece sono indicate delle estensioni, allora queste saranno le sole consentite. Per permettere il caricamento di file senza estensione, dovrete inserire due virgole consecutive, ad esempio ",,".
DeniedFilesList: è una stringa contenente la lista delle estensioni di file non consentite, separate da virgola. Esempio: MyUpLoad.DeniedFilesList = "exe,com,bat"
Il valore di default è la stringa vuota, che significa che tutte le estensioni sono permesse. Se invece sono indicate delle estensioni, allora queste saranno negate, ed avranno precedenza su quelle consentite. Per negare il caricamento di file senza estensione, dovrete inserire due virgole consecutive, ad esempio ",,".
DenyPhysicalPath: è un boolean che indica se è possibile o meno indicare un percorso fisico del file in fase di caricamento. Esempio: MyUpLoad.DenyPhysicalPath = true
Il valore di default è false.
ContentDisposition: è una stringa, che contiene l'intestazione HTTP del content disposition per il tipo MIME. Esempio: MyUpLoad.ContentDisposition = "inline;"
I valori possono essere: "attachment;" "inline;" ""
DownloadBlockSize: questo valore, espresso in byte, indica la dimensione dei dati che vengono letti dalla sorgente in una volta. Esempio: MyUpLoad.DownloadBlockSize = 4096
Questa proprietà è utile ai metodi FieldToFile, DownloadFile e DownloadField.
TotalBytes: questo valore, espresso in byte, indica la dimensione totale dei dati "postati". Esempio: Response.Write("Bytes=" & MyUpLoad.TotalBytes & "<br>")
BinaryData: questa caratteristica è un array di byte, contenente il flusso dei dati caricati in forma binaria. Sintassi: MyUpLoad.BinaryData(lngIndex) dove lngIndex è l'indice dell'array di byte.
Metodi:
Upload: effettua il caricamento dei file dal cliente al server in una cartella di sistema. Non restituisce alcun valore
Save: salva tutti i file caricati sul disco. Effettua quindi la copia dei file caricati dalla cartella di sistema alla cartella di destinazione, che può essere passata come parametro. Qualora non sia indicata alcuna destinazione, i file verranno copiati nel percorso corrente. Restituisce un valore intero (Long) che indica il numero dei file salvati.
sintassi: contatore = MyUpLoad.Save( [PercorsoDiDestinazione] )
DownloadFile: permette di scaricare il file indicato come sorgente. E' possibile anche indicare il content type ed il nuovo nome.
sintassi: MyUpLoad.DownloadFile(fileSorgente[, ContentType, NuovoNomeFile])
esempio: MyUpload.DownloadFile "D:\www\WM_qpWWsIhg\vostrodominio.it\myFile.txt", "application/x-zip-compressed", "NuovoNomeFile.txt"
DownloadField: permette di scaricare il file indicato come sorgente in un campo di un database. E' possibile anche indicare il content type ed il nuovo nome.
sintassi: MyUpLoad.DownloadField(campoSorgente[, ContentType, NuovoNomeFile])
esempio: MyUpload.DownLoadFied "myRecordSet("FILE")", "application/x-zip-compressed", "NuovoNomeFile.txt"
FieldToFile: permette di scrivere un file da un database ad una specifica directory. Questo metodo crea un nuovo file.
sintassi: MyUpLoad.FieldToFile NomeCampo(FileDiDestinazione)
UploadInFile: questo metodo crea un nuovo file contenente l'intero contenuto dei dati "postati"
sintassi: MyUpLoad.UploadInFile (FileDiDestinazione)