Rozhraní pro download souborů pomocí ASP – základ aplikace

    0

    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