Un amico mi ha chiesto di scrivergli un piccolo script che contasse il download di alcuni sui file. Chi ha uno spazio web non dotato di statistiche a livello server come AwStats (che leggono i log di IIS o Apache) non può avere un conteggio dei download dei file. I contatori gratuiti presenti sul web consentono di contare gli accessi solo alle pagine web (in realtà viene conteggiato il numero di accessi al contatore stesso, che può essere un'immagine o uno script).
Lo script che ho scritto è di semplice utilizzo e può essere utilizzato per tutti i file che si vuole monitorare.<a href="download.asp?f=NOMEDELFILE">Scarica il file</a>
' **********************************************************************************
' SCRIPT CONTATORE E LOG DEI DOWNLOAD DI UN FILE
' il log avviene su file di testo che vengono creati automaticamente in base al nome
' del file da tracciare.
'
' UTILIZZO
' <a href="Download.asp?f=nomedelfile">Scarica il file</a>
'
' PARAMETRI
' QueryString
' f: nome del file da scaricare
'
' All'interno del codice
' CartellaDownload: cartella che contiene i file da tracciare e dove verranno scritti
' i file di log.
'
' Autore: Alexandar Fusè - alex.fuse@gmail.com
' Sito web: www.afcs.it
' Data: 30 Maggio 2008
' Lo script è utilizzabile per qualsiasi scopo anche commerciale
' **********************************************************************************
Sub IncrementaContatore(CartellaDownload, NomeFile)
Dim objFSO, objTextFile
Dim sRead, sReadLine, sReadAll
Dim NomeFileContatore
Dim ip, user_agent,referer
' calcolo i nomi dei file
NomeFileContatore = CartellaDownload & "Contatore." & NomeFile & ".txt"
NomeFileLog = CartellaDownload & "Log." & NomeFile & ".txt"
NomeFileContatore = Server.MapPath(NomeFileContatore)
NomeFileLog = Server.MapPath(NomeFileLog)
Set objFSO = CreateObject("Scripting.FileSystemObject")
' LETTURA DEL CONTATORE
if objFSO.FileExists(NomeFileContatore) then
Set objTextFile = objFSO.OpenTextFile(NomeFileContatore,1)
if not objTextFile.AtEndOfStream then
Num=objTextFile.ReadAll
end if
Num=Trim(num)
if isNumeric(Num) then
Num = cint(Num) + 1
else
Num = 1
end if
objTextFile.Close
set objTextFile = nothing
else
Num = 1
end if
' SCRITTURA DEL CONTATORE
Set objTextFile = objFSO.OpenTextFile(NomeFileContatore, 2, true)
objTextFile.Write(Num)
objTextFile.Close
set objTextFile = nothing
' SCRITTURA DEL LOG
Set objTextFile = objFSO.OpenTextFile(NomeFileLog, 8, true)
ip = Request.ServerVariables("REMOTE_ADDR")
user_agent = Request.ServerVariables("HTTP_USER_AGENT")
referer = Request.ServerVariables("HTTP_REFERER")
objTextFile.WriteLine(now & ";" & ip & ";" & user_agent & ";" & referer)
objTextFile.Close
set objTextFile = nothing
Set objFSO = nothing
End Sub
Const adTypeBinary = 1
Dim objStream
Dim strFilePath
Dim CartellaDownload, FileNameSorgente, FileNameSorgente_FullPath
Dim affFName
CartellaDownload = "123456\"
Response.Buffer=true
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
FileNameSorgente = request("f")
FileNameSorgente = replace(FileNameSorgente,"\","_")
FileNameSorgente = replace(FileNameSorgente,"/","_")
affFName = split(FileNameSorgente,".")
ext = lcase(affFName(ubound(affFName)))
FileNameSorgente_FullPath = CartellaDownload & FileNameSorgente
FileNameSorgente_FullPath = Server.MapPath(FileNameSorgente_FullPath)
objStream.LoadFromFile FileNameSorgente_FullPath
IncrementaContatore CartellaDownload, FileNameSorgente
'Aggiunge un header per far scaricare il file
if ext="jpg" or ext="gif" or ext="png" then
' le immagini vengono visualizzate inline dentro al browser
Response.AddHeader "Content-Disposition", "inline;filename=" & FileNameSorgente
Response.ContentType = "image/" & lcase(ext)
else
Response.AddHeader "Content-Disposition", "attachment;filename=" & FileNameSorgente
'Imposta il content su octet-stream, forzando l'apertura fuori dal browser
Response.ContentType = "application/octet-stream"
end if
'Manda il contenuto con BinaryWrite
Response.BinaryWrite objStream.Read