Come contare i download di un file?

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.
E' sufficiente inserire i file da monitorare in una cartella, che deve essere dotata dei diritti di scrittura da parte del servizio web.
  • Copiare nella root del tuo sito.
  • Configurare dentro download.asp la cartella da cui attingere i file da scaricare e dove memorizzare i contatori, attualmente il valore è 123456
  • Dare i diritti di scrittura alla cartella del punto 2
  • Inserire nell'html la chiamata:
    <a href="download.asp?f=NOMEDELFILE">Scarica il file</a>
Lo script crea 2 file txt, uno è un semplice contatore che si incrementa di volta in volta, l'altro è un mini file di log che registra data, ip, user_agent e referer.

Lo script è free :) Script-Asp-Contatore-Download.zip

' **********************************************************************************
' 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