ASP.NET

Automatisches Bereitstellen versionierter Downloads

Über ein UserControl und Dateimuster immer die aktuellste Datei anbieten

Webmaster, wie ich, die auf Ihrer Web-Site selbstentwickelte Tools zur Verfügung stellen, haben stets das gleiche Problem, wenn sie eine neue Version veröffentlichen wollen: neben der Erstellung des Downloads-Pakets, muss man auch noch den neuen Download über einen angepassten Link in die Seiten einbinden, sofern aus dem Dateinamen ersichtlich werden soll, um welche Version es sich handelt.

Mit etwas Code lässt sich das Deployment solcher Pakete aber auf den reinen FTP-Upload beschränken. Soll sich die Seite doch selbst den aktuellen Download heraussuchen...

In ASP.NET lässt sich das Ganze wunderbar in ein UserControl verpacken, sodaß man beim Entwickeln der Web-Seiten schnell einen neuen Download deklarieren kann, ohne erneut viel Code zu schreiben.

Beginnen wir damit, wie der Download-Link der versionierten Datei aussehen soll. Auf zerbit.de halte ich es so, dass in der ersten Zeile der komplette Name der Datei abgebildet wird und in einer zweiten die Größe der Datei, sowie eine knappe Beschreibung des Pakets.

Beispiel für OutlookSignature:

<a style="font-weight:bold"
   href="~/download/outlooksignature1704.zip">outlooksignature1704.zip</a>
<br />85 KB - Programm mit Beispielen

Mit diesen zwei Zeilen erstellen wir ein neues UserControl namens DownloadLink.ascx, das folgendes Markup besitzt:

<%@ Control
    Language="VB"
    AutoEventWireup="false"
    CodeFile="DownloadLink.ascx.vb"
    Inherits="controls_DownloadLink" %>

<a style="font-weight:bold"
   href="<%=pstcDownloadFile.Path%>"><%=pstcDownloadFile.Caption%></a>
<br /><%=pstcDownloadFile.Size%> - <%=pstcDownloadFile.Remark%>

Anstelle des HREF-Attributs und des Inhaltes des HTML-Links, sowie der zweiten Zeile, ist etwas Inline-Code getreten, der die Werte einer Struktur namens pstcDownloadFile abruft. Diese Structure ist an erster Stelle im Code-Behind deklariert und beinhaltet alle notwendigen Informationen:

Structure DownloadFileStructure
	Dim Name As String
	Dim Path As String
	Dim Caption As String
	Dim Size As String
	Dim MajorVersion As Integer
    Dim MinorVersion As Integer
	Dim Release As Integer
	Dim Remark As String
End Structure

Public pstcDownloadFile As New DownloadFileStructure

Um die Struktur befüllen zu können muss nun zunächst einmal definiert werden welche Eigenschaften das Control bekommen soll:

Eigenschaft Beschreibung Variable im Code
DownloadPath Pfad zum Download-Ordner aus dem der Download herausgesucht werden soll _strDownloadPath
FilePattern Muster der Download-Datei _strFilePattern
Caption Alternativer Inhalt des Links, wenn nicht der Dateiname verwendet werden soll: _strCaption
Remark Kurze Beschreibung des Pakets _strRemark

Für diese Eigenschaften werden Zugriffsmodifizierer in der Code-Behind-Datei erzeugt, die ich mir hier jetzt mal erspare. Im Download des UserControls weiter unten sind sie natürlich vorhanden.

Das Muster der Download-Datei ist die entscheidende Eigenschaft, denn über sie wird festgelegt nach was im Download-Ordner gesucht werden soll. Da sich die aufeinanderfolgenden Versionspakete in Ihrer Benennung nur durch in der Angabe der Versionsnummer unterscheiden, kann man diese durch einen Platzhalter ersetzen.

So wird zum Beispiel aus:

outlooksignature1704.zip

folgendes Muster:

outlooksignature|xyzz|.zip

Die beiden Pipes begrenzen den auszutauschenden Teil des Dateinamens und die einzelnen Teile der Version werden wie folgt ersetzt:

Platzhalter Beschreibung
x Major-Version
y Minor-Version
z Release/Build

  • Wichtig bei der Benennung der Download-Dateien ist immer das Muster einzuhalten, d.h. ist, wie in diesem Beispiel, das Release zweistellig angegeben, muss bei einem einstelligen Release eine führende Null vorhanden sein.

Mit diesen Informationen ausgestattet, kommen wir nun zur Methode GetActualDownloadFileName, die den aktuellsten Download aus dem angegebenen Order herauspickt und die Struktur pstcDownloadFile befüllt.

Protected Sub GetActualDownloadFileName()

	'Pattern splitten und Index des ersten Begrenzers merken
	Dim arrPattern() As String = _strFilePattern.Split(New [Char]() {"|"c})
	Dim intIndexLeft As Integer = _strFilePattern.IndexOf("|")

	'Such-Pattern für FileInfo erstellen
	Dim stbSearchPattern As New StringBuilder(arrPattern(1))
	stbSearchPattern.Replace("x", "?")
	stbSearchPattern.Replace("y", "?")
	stbSearchPattern.Replace("z", "?")
	Dim strSearchPattern As String = _
		arrPattern(0) & stbSearchPattern.ToString & arrPattern(2)

	'FileInfo initialisieren und Suche durchführen
	Dim objDir As DirectoryInfo = _
		New DirectoryInfo(HttpContext.Current.Server.MapPath(_strDownloadPath))
	Dim objFiles As FileInfo() = _
		objDir.GetFiles(strSearchPattern, SearchOption.TopDirectoryOnly)

	'Mit Such-Pattern Vergleichs-Pattern erzeugen
	Dim strCompareVersion As String = stbSearchPattern.ToString.Replace("?", "0")

	Dim intFoundFile As Integer = 0
	Dim strFileVersion As String = ""

	'Ergebnis durchlaufen und Dateien anhand des Versionsstrings vergleichen
	If objFiles.Length > 0 Then
		For i As Integer = 0 To objFiles.Length - 1

			'Versionsinformation aus Dateinamen extrahieren
			strFileVersion = _
				objFiles(i).Name.Substring(intIndexLeft, strCompareVersion.Length)

			'Pattern mit String.Comparer lexikalisch vergleichen
			If String.Compare(strFileVersion, strCompareVersion) > 0 Then
				strCompareVersion = strFileVersion 'Vergleichspattern neu setzen
				intFoundFile = i 'Index merken
			End If

		Next

		'Name der Datei in Struktur ablegen
		pstcDownloadFile.Name = objFiles(intFoundFile).Name

		'Größe der Datei in KiloByte in Struktur ablegen
		pstcDownloadFile.Size = _
			Format(objFiles(intFoundFile).Length / 1024, "#,##0") & " KB"

		'Versionsinformationen ermitteln und in Struktur ablegen
		Dim strVersionPattern As String = _
			_strFilePattern.Substring(intIndexLeft, strCompareVersion.Length)

		Dim intMajorStart As Integer = strVersionPattern.IndexOf("x") - 1
		Dim intMinorStart As Integer = strVersionPattern.IndexOf("y") - 1
		Dim intReleaseStart As Integer = strVersionPattern.IndexOf("z") - 1

		pstcDownloadFile.MajorVersion = strFileVersion.Substring( _
			intMajorStart, intMinorStart - intMajorStart)
		pstcDownloadFile.MinorVersion = strFileVersion.Substring( _
			intMinorStart, intReleaseStart - intMinorStart)
		pstcDownloadFile.Release = strFileVersion.Substring( _
			intReleaseStart, strCompareVersion.Length - intReleaseStart)

	End If

End Sub

Die Methode erzeugt aus dem Muster zunächst ein Such-Pattern, mit dem alle in Frage kommenden Dateien im Download-Ordner ermittelt werden und vergleicht dann alle Treffer lexikalisch, d.h. anhand der extrahierten Version als Text. Das funktioniert, da zum Beispiel der String "1704" einen höheren Wert hat als "1299". Die Fundstelle des höchsten Wertes wird am Ende herangezogen, um die Dateiinformationen zu extrahieren und in der Struktur abzulegen.

Fehlt nur noch die Initialzündung, sprich das Event, das den Stein innerhalb des Controls ins Rollen bringt:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
	Handles Me.Load

	If _strDownloadPath.Length > 0 And _strFilePattern.Length > 0 Then

		'Aktuellste Datei ermitteln
		Call GetActualDownloadFileName()

		'Dateiziel festlegen
		pstcDownloadFile.Path = _
			ResolveClientUrl(_strDownloadPath) & "/" & pstcDownloadFile.Name

		'Inhalt des Link-Elements
		If _strCaption.Length > 0 Then
			pstcDownloadFile.Caption = _strCaption
		Else
			pstcDownloadFile.Caption = pstcDownloadFile.Name
		End If

		'Dateianmerkung festlegen
		pstcDownloadFile.Remark = _strRemark

	End If

End Sub

Das fertige UserControl kann man nun entweder zentral über die web.config dem Web bekanntmachen...

<add tagPrefix="uct" tagName="DownloadLink"
	src="~/MyControls/DownloadLink.ascx" />

oder es lediglich auf den ASPX-Seiten einbinden auf denen es benötigt wird...

<%@ Register TagPrefix="ucx" TagName="DownloadLink"
	Src="~/MyControls/DownloadLink.ascx" %>

Die Deklaration innerhalb einer ASPX-Seite sieht dann zum Beispiel so aus:

<uct:DownloadLink ID="lnkOutlookSignature" runat="server"
	DownloadPath="~/download"
	FilePattern="outlooksignature|xyzz|.zip"
	Remark="Programm mit Beispielen" />

In meinem Beispiel verwende ich im Markup des Controls nicht alle Werte, die die Struktur zur Verfügung stellt und in der entsprechenden ASPX-Seite auch nicht alle Eigenschaften, aber jeder der dieses UserControl einsetzen möchte, kann sich seinen Download-Link nach eigenem Gusto anpassen.

In Zukunft ist das Deployen einer neuen Version eines Downloads mit einem FTP-Upload getan. Den Rest erledigt ASP.NET.

zum Download...
kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

132 Kommentare bislang...

  • air max 2009 pour femme Luo Xiao domaine de domaine ma?tre, ce qui une grande puissance et de prestige "

    Soudain, une voix forte est venue du c?té du ciel, suivi d'un rouge vert figure E et débarqués directement vers le bas, venir en appui en bords complètement enveloppé dans un chiffon dans les longs couteaux, de longs couteaux, car ce torchon enroulé complètement ne vois pas la lame, mais il a été exposé à la poignée, mais il est extrêmement délicat.

    "Ce couteau ......"

    Hauteur au-dessus du mouvement des yeux Qingyan Ling, quelque peu étonné.

    En fait, l'ombre de ce vert rouge è juste à c?té, Ling Qingyan déjà sentir, tout simplement parce qu'ils ne savent pas l'origine, il n'y a pas d'ouverture.

    Maintenant, cependant, voir ce chiffre directement, debout sur le c?té principal de ce plus d'une centaine, Ling Qingyan déjà conna?tre l'identité de la personne, est sans doute plus d'une centaine du Ma?tre, que le vent du continent que la robe blanche du respect de Dieu puissante statue de dieu envoyé à son c?té pour protéger son peuple.

    Outils et essayer de couteau, Ling Qingyan une identifiées certainement pas une fée ordinaire, je crains que ce soit un artefact

    Après tout, entra?né par le respect de guerrier de Dieu, Dieu a fait, est généralement donnée de l'artefact.

    "Tout à l'heure, c'est votre main?"

    Luo Xiao domaine domaine ma?tre d'une paire de yeux, à travers un frisson, à regarder cela en face de l'homme d'age moyen.

    De corps de l'homme d'age moyen, il se sentait un soup?on de danger, tout à coup l'esprit est directement accroché ...

    ?Eh bien?"
    132
    air max 2009 pour femme : Freitag, 4. Mai 2012 16:28
  • We all know what arrives going to females who suit on the famed red-colored lacquered individual shoes. They are immediately filled using a wicked perception of alluring do it yourself and fall hopelessly in adore with its creator: the superb shoe custom made CHRISTIAN lOUBOUTIN SHOES.


    Where To Buy CHRISTIAN lOUBOUTIN shoes assisted accompany stilettos aback into appears within 1990s and 2000s, developing dozens of variations with heel heights of 120mm (4.72 inches) and higher.


    Christian Louboutin shoes are well-known using the red-colored sole,high quality,unique design and design as well as many female hollywood stars will choose them once they show up at some really important event and stroll within red-colored carpet.


    Christian Louboutin Balota are made in accordance with Somatology to comfortably suit everyone's feet. which means you won't be worried about suffering in the direction of beautiful.The designer's ethos can be to "make shoes which could be like jewels" and each and every special design and design demonstrates unparalleled best quality and an innate sultriness.
    131
    Where To Buy CHRISTIAN lOUBOUTIN : Sonntag, 29. April 2012 03:19
  • 130
    Oakley Abandon Sunglasses : Donnerstag, 26. April 2012 08:09
  • 129
    mac cosmetics online : Donnerstag, 26. April 2012 06:07
  • I love this article, it's very well.<a href="http://www.macosmeticstore.com/mac-lipstick-mac-liberty-of-london-lipstick-c-43_368.html">MAC Liberty of London Lipstick</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-commit-sq-sunglass-c-1_17.html">Replica Oakley Commit SQ Sunglass</a><a href="http://www.macosmeticstore.com/mac-lipstick-mac-surf-baby-lipstick-c-43_986.html">MAC Surf Baby Lipstick</a><a href="http://www.oakleysbuy.com/oakley-lifestyle-sunglasses-oakley-oil-rig-sunglasses-c-69_86.html">Replica Oakley Oil Rig Sunglasses</a><a href="http://www.macosmeticstore.com/mac-lipstick-mac-to-the-beach-lipstick-c-43_990.html">MAC To The Beach Lipstick</a><a href="http://www.oakleysbuy.com/oakley-lifestyle-sunglasses-oakley-ravishing-sunglasses-c-69_123.html">replica Oakley Ravishing Sunglasses</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-enduring-pace-sunglass-c-1_11.html">Replica Oakley Enduring Pace Sunglass</a><a href="http://www.macosmeticstore.com/mac-lipstick-mac-venomous-villains-lipstick-c-43_369.html">MAC Venomous Villains Lipstick</a><a href="http://www.oakleysbuy.com/oakley-lifestyle-sunglasses-oakley-plaintiff-sunglasses-c-69_117.html">Replica Oakley Plaintiff Sunglasses</a><a href="http://www.macosmeticstore.com/mac-liquid-foundation-c-673.html">MAC Liquid Foundation</a><a href="http://www.oakleysbuy.com/oakley-lifestyle-sunglasses-oakley-speechless-sunglasses-c-69_113.html">Replica Oakley Speechless Sunglasses</a><a href="http://www.macosmeticstore.com/mac-liquid-foundation-mac-studio-fix-liquid-foundation-c-673_611.html">MAC Studio Fix Liquid Foundation</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-flak-jacket-sunglass-c-1_14.html">Replica Oakley Flak Jacket Sunglass</a><a href="http://www.oakleysbuy.com/oakley-active-sunglasses-oakley-tightrope-sunglasses-c-67_118.html">Replica Oakley Tightrope Sunglasses</a><a href="http://www.macosmeticstore.com/mac-loose-powder-c-674.html">MAC Loose Powder</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-half-jacket-sunglass-c-1_4.html">Replica Oakley Half Jacket Sunglass</a><a href="http://www.oakleysbuy.com/oakley-sport-sunglasses-oakley-flak-jacket-sunglasses-c-71_108.html">Replica Oakley Flak Jacket Sunglasses</a><a href="http://www.macosmeticstore.com/mac-makeup-pencial-c-1000.html">MAC Makeup Pencial</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-jawbones-sunglass-c-1_16.html">Replica Oakley Jawbones Sunglass</a><a href="http://www.oakleysbuy.com/oakley-sport-sunglasses-oakley-half-jacket-sunglasses-c-71_87.html">Replica Oakley Half Jacket Sunglasses</a><a href="http://www.macosmeticstore.com/mac-makeup-remover-c-45.html">MAC Makeup Remover</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-m-frame-sunglass-c-1_12.html">Replica Oakley M Frame Sunglass</a><a href="http://www.oakleysbuy.com/oakley-sport-sunglasses-oakley-jawbone-sunglasses-c-71_88.html">Replica Oakley Jawbone Sunglasses</a><a href="http://www.macosmeticstore.com/mac-mascara-mac-plush-lash-mascara-c-46_336.html">Mac Plush Lash Mascara</a><a href="http://www.shadesbuy.com/oakley-sport-sunglasses-oakley-radar-sunglass-c-1_2.html">Replica Oakley Radar Sunglass</a><a href="http://www.oakleysbuy.com/oakley-sport-sunglasses-oakley-m-frame-sunglasses-c-71_110.html">Replica Oakley M Frame Sunglasses</a><a href="http://w
    128
    mac cosmetics online : Donnerstag, 26. April 2012 05:54

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 249

  • Datum: 28.01.2008
    Kategorie: ASP.NET
    Zugriffe: 3.741
    Kommentare: 132
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei