Představte si situaci, že potřebujete umožnit download souborů a současně nechcete při každé změně souborů modifikovat stránku se seznamem souborů a přitom nechcete či nemůžete povolit procházení adresářové struktury. V tomto článku se dozvíte jak pomocí ASP vytvořit takovouto stránku.

Pro vytvoření seznamu souborů použijeme metodu getFolder objektu Scripting.FileSystemObject čímž získáme referenci na objekt folder, který obsahuje kolekci Files. Tato kolekce obsahuje seznam souborů a jejich vlastností.

Bohužel zde není metoda, která by umožnila třídit seznam souborů podle jména,velikosti či dalších kritérii. Toto třídění je ovšem často nutné a často je návštěvníky požadováno. Proto v dnešním článku připravím „půdu“ pro jednoduché doplnění třídícího mechanismu, který umožní třídit výpis souborů podle jednotlivých vlastností souborů.

Dalším problém, který se objeví při realizaci downloadu je fakt, že pokud uživatel bude mít nastaveno otevírání souboru přímo v nějaké aplikaci bude muset soubor poté z otevřené aplikace uložit. Existuje však možnost jak přimět prohlížeč, aby zobrazil dialog zda soubor uložit nebo otevřít přestože má uživatel nastavenou trvalé otevírání souboru do aplikace. Celý „fígl“ spočívá v poslání té správné hlavičky http protokolu před vlastním posláním souboru.

A jak bude vše dohromady sestaveno? Celá aplikace bude obsahovat dva skripty a to sice default.asp, který zajistí vytvoření seznamu souborů a umožní jejich třídění a přesměrování na skript download.asp, který provede poslání souboru návštěvníkovi. Skript download.asp bude připraven na doplnění o statistiku stažení jednotlivých souboru, která bude uvedena v následujícím článku.

A nyní konečně k vlastním skriptům. Nejprve podrobněji skript default.asp. Ve skriptu jsou tyto tři procedury PripravSoubory,TridSoubory a VypisSoubory. Procedura PripravSoubory je určena k načtení seznamu souboru do pole pro další zpracování. Procedura TridSoubory je prozatím prázdná a její obsah bude předmětem některého z příštích článků. No a konečně výpis souborů do přehledné tabulky zajistí procedura VypisSoubory.

<%
   FILE_FOLDER = left(Request.ServerVariables(„PATH_TRANSLATED“),inStrRev(Request.ServerVariables(„PATH_TRANSLATED“), „\“))
   Dim FileArray()
%>
<html>
<head>
   <title>Download Souborů</title>
   <style type=“text/css“>
      .bunka{font-family: „arial ce“, „helvetica ce“,“arial“,“helvetica“; color:#000000; font-size: 12px; font-weight: normal;}
   </style>
</head>
<body>
      <table border=1 id=tblfiledata cellpadding=2 cellspacing=0>
         <tr>
            <td class=bunka><a href=“default.asp?sort=name“>Jméno souboru</a></td>
            <td class=bunka><a href=“default.asp?sort=type“>Typ souboru</a></td>
            <td class=bunka><a href=“default.asp?sort=size“>Velikost souboru</a></td>
            <td class=bunka><a href=“default.asp?sort=dtmod“>Poslední změna</a></td>
         </tr>

<%
   PripravSoubory
   TridSoubory(Request.QueryString(„sort“))
   VypisSoubory
%>
      </table>
</body>
</html>
<%
Sub PripravSoubory()
   Dim objFS, objFolder, objFile,intCounter
   intCounter = 0
   Set objFS = Server.CreateObject(„Scripting.FileSystemObject“)
   Set objFolder = objFS.getFolder(FILE_FOLDER)
   ReDim Preserve FileArray(objFolder.Files.Count,4)
   For Each objFile in objFolder.Files
      FileArray(intCounter, 0) = objFile.Name
      FileArray(intCounter, 1) = „<a href=“ & Chr(34) & „Download.asp?File=“ _
      & objFile.Path & „&Name=“ & objFile.Name & „&Size=“ & objFile.Size & Chr(34) _
      & “ onMouseOver=“ & Chr(34) & „self.status='“ & objFile.Name & „‚; return true;“ & Chr(34) _
      & “ onMouseOut=“ & Chr(34) & „self.status=“; return true;“ & Chr(34) & „>“ & objFile.Name & „</a>“
      FileArray(intCounter, 2) = objFile.Type
      FileArray(intCounter, 3) = objFile.Size
      FileArray(intCounter, 4) = objFile.DateLastModified
      intCounter = intCounter + 1
   Next
   Set objFile = Nothing
   Set objFolder = Nothing
   Set objFS = Nothing
End Sub
Sub VypisSoubory()
   intRows = uBound(FileArray, 1)
   intCols = uBound(FileArray, 2)
   For x = 0 To intRows -1
      response.write „<tr>“&vbcrlf
      For z = 0 To intCols
         If z > 0 Then
            response.write „<td CLASS=bunka>“ & FileArray(x, z) & „</td>“&vbcrlf
         End IF
      Next
      response.write „</tr>“ &vbcrlf&vbcrlf
   Next
End Sub
Sub TridSoubory(sort)
‚ neni implementováno – bude v dalším díle
End Sub
%>

Ve skriptu download.asp je třeba před vlastním posláním souboru nastavit response.buffer na true a také tento buffer vyčistit. Pro vlastní poslání souboru směrem ke klientovi použijeme objekt ADODB.Stream. Nejprve nastavíme příslušné hlavičky http protokolu a poté odešleme vlastní soubor pomocí Response.BinaryWrite. Celou akci zakončíme odesláním obsahu bufferu pomocí Response.Flush.

<%
   Dim strFilePath, strFileSize, strFileName
   Const adTypeBinary = 1
   Response.Buffer = True
   strFilePath = Request.QueryString(„File“)
   strFileSize = Request.QueryString(„Size“)
   strFileName = Request.QueryString(„Name“)
   Response.Clear
   Set objStream = Server.CreateObject(„ADODB.Stream“)
   objStream.Open
   objStream.Type = adTypeBinary
   objStream.LoadFromFile strFilePath
   strFileType = lcase(Right(strFileName, 4))
   Select Case strFileType
      Case „.asf“
         ContentType = „video/x-ms-asf“
      Case „.avi“
         ContentType = „video/avi“
      Case „.doc“
         ContentType = „application/msword“
      Case „.zip“
         ContentType = „application/zip“
      Case „.xls“
         ContentType = „application/vnd.ms-excel“
      Case „.gif“
         ContentType = „image/gif“
      Case „.jpg“, „jpeg“
         ContentType = „image/jpeg“
      Case „.wav“
         ContentType = „audio/wav“
      Case „.mp3“
         ContentType = „audio/mpeg3“
      Case „.mpg“, „mpeg“
         ContentType = „video/mpeg“
      Case „.rtf“
         ContentType = „application/rtf“
      Case „.htm“, „html“
         ContentType = „text/html“
      Case „.asp“
         ContentType = „text/asp“
      Case Else
         ContentType = „application/octet-stream“
   End Select
   Response.AddHeader „Content-Disposition“, „attachment; filename=“ & strFileName
   Response.AddHeader „Content-Length“, strFileSize
   Response.Charset = „UTF-8“
   Response.ContentType = ContentType
   Response.BinaryWrite objStream.Read
   Response.Flush
   objStream.Close
   Set objStream = Nothing
%>

Tento skript lze jednoduše doplnit o sledování počtu stažení jednotlivých souborů. Jak to lze provést se dozvíte v dalším pokračování článku. Dnes jen prozradím, že vám předvedu hned dvě naprosto odlišná řešení pro realizaci počitadla stažení souborů.

Na závěr dnešního článku ještě jeden užitečný tip. Představte si situaci, že chcete soubory umístit mimo kořenovou strukturu webu. Zdánlivě nemožná věc je takto zcela jednoduchá a bez problémová. Stačí pouze ve skriptu default.asp do proměnné FILE_FOLDER uvést cestu k adresáři kde jsou umístěny soubory ke stažení.

Vše co jsem dnes popisoval si máte možnost stáhnout zde.

To je pro dnešek vše. Jak jsem již předeslal do skriptů je možné například doplnit řazení výpisu souborů podle všech zobrazovaných údajů či statistikou stažení jednotlivých souborů. O čem si přečtete příští týden závisí na tom jak budete hlasovat v anketě.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět