Multi-File Upload (2): Aktivieren der neuen Seitentypen

An dieser Stelle kommt der etwas kniffelige Teil, der mit größter Vorsicht auszuführen ist. Es ist nun eine Anpassung der Standardeinspielseite für multiple Dateien UPLOAD.ASPX notwendig – diese befindet sich im Allgemeinen im Seitenverzeichnis von WSS (c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS). Ich empfehle dringend, erst einmal eine Sicherheitskopie der Datei anzulegen.

Die Änderungen umfasst drei Teile: die UPLOAD.ASPX wird an den neuen Seitentypen gebunden, es wird ein Platzhalterbereich für zusätzliche Eingaben vorbereitet und das Script zum Anstossen des Einspielvorgangs wird verändert. Bei den Veränderungen (mit NOTEPAD.EXE zum Beispiel – XML Editoren sind für HTML / ASP.NET Seiten nicht zwingend geeignet) ist zu beachten, dass nicht immer ganze Zeilen betroffen sind. Ich beschreibe im Folgende das Vorgehen basierend auf meiner lokalen Installation (WSS 3.0 mit SP1 Englisch auf Windows 2003 R2 SP2).

Gemäß den notwendigen Veränderungen finden sich im Source\Fragments Unterverzeichnis des Installationsverzeichnisses drei UPLOAD.ASPX Dateien mit den Zusätzen HEAD, FORM und SCRIPT. Diese Fragmente können zum einfachen Anpassen der UPLOAD.ASPX verwendet werden – die Zeilen mit den drei Punkten sind IMMER zu entfernen!

HEAD: Die erste Zeile der originalen UPLOAD.ASPX beginnt (!) mit einer Sequenz

<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%> <%@ Page Language="C#" Inherits="Microsoft.SharePoint.ApplicationPages.UploadPage" MasterPageFile="~/_layouts/application.master" %>

Nur dieser Beginn ist durch das HEAD Fragment (ohne die letzte … Zeile) zu ersetzen.

FORM: Das FORM Fragment kann eigentlich nach Lust und Laune eingesetzt werden, wenn man sich etwas auskennt. Ich habe mich entschieden, die zusätzlichen Eingabefelder direkt unter der ‚Nicht überschreiben‘ Auswahl vorzunehmen. Dazu ersetzt das FORM Fragment (ohne die beiden … Zeilen) folgenden HTML Ausschnitt:

<Template_Control>
<asp:CheckBox id="OverwriteMultiple" Checked="true" Text="<%$Resources:wss,upload_document_overwrite_version%>" runat="server" />
</Template_Control>

Hier ein Beispiel (ohne den Versuch einer Formatierung):
Neue Einspielseite

SCRIPT: Das alles bringt aber gar nichts, wenn nicht auch der Scriptcode beim Einspielen so verändert wird, dass er die Eingabewerte auch berücksichtigt und den neuen Einspielvorhang aktiviert. Dazu ersetzt das SCRIPT Fragment das vorhandene Script einfach vollständig (wieder ohne die beiden … Zeilen):

function _spFormOnSubmit()
{
var putoptsElement = document.getElementById("putopts");
var overwriteElement = document.getElementById("&ld;<%= OverwriteMultiple.ClientID %>");
putoptsElement.value = overwriteElement.checked ? "true" : "false";
document.getElementById("idUploadCtl").MultipleUpload();
return false;
}

Das war es erst einmal. Die Veränderungen werden nach einem Neustart des Web Servers (IISReset aufrufen) aktiv. Werden keine weiteren Schritte unternommen, sollte sich alles wie vorher verhalten. Allerdings lauern die neuen Möglichkeiten im Hintergrund gleich um die Ecke.

Soweit dazu

Jochen

Multi-File Upload (1): Bereitstellen der neuen Seitentypen

Nach der Installation findet sich im Installationsverzeichnis die Assembly (DLL) JMS.SharePoint.Upload.dll, die zwei neue ASP.NET Seitentypen enthält.

Der eine Typ von Seite arbeitet völlig unsichtbar im Hintergrund und nimmt eine Anzahl von Dateien zum Einspielen in eine Document Library entgegen. Dabei wird erst einmal grundsätzlich sichergestellt, dass alle Einspielvorgänge mit einer eingescheckten Datei enden (Bug oder Feature – das lassen wir hier mal offen). Also selbst wenn nicht gesetzte Pflichteigenschaften vorhanden sind, erscheint die Datei als eingestellt in der Library. Beim Pflegen der Eigenschaften müssten die Werte dann allerdings wie gewohnt nachgepflegt werden, damit ein Speichern des Pflegeformulars möglich ist.

Anders als beim konventionellen WSS 3.0 Einspielvorgang können aber beliebig Werte zu Eigenschaften angegeben werden, die dann für alle eingespielten Dateien übernommen werden. Diese zusätzlichen Werte werden über die URL übertragen und unterliegen somit einigen Einschränkungen – bezüglich der Datentypen oder der Größe der Werte etwa: URLs können maximal 1000 Zeichen lang werden. Für den normalen Einsatz sollte dies aber kein wirkliches Problem sein. Zum Testen habe ich mit den Datentypen Text (einzeilig), ganze Zahl, Ja/Nein Wahrheitswert und 1-aus-N Auswahl gearbeitet. Es ist übrigens nicht zwingend erforderlich, dass die in der URL übertragenen Werte zu Pflichteigenschaften gehören.

Ein bißchen kritisch ist an dieser Stelle, dass die ’nicht Überschreiben‘ Einstellung des Dateiauswahlformulars nur oberflächlich ausgewertet wird. Ist das Überschreiben verboten und wird versucht, eine existierende Datei erneut einzuspielen, so wird diese ohne Warnung vom Einspielvorgang ausgenommen. Alle möglichen Einspielvorgänge werden abgeschlossen.

Der zweite Seitentyp erweitert die Standardeinspielseite UPLOAD.ASPX von WSS 3.0. Neu ist die Möglichkeit, auf der Seite Eingabefelder einzublenden, deren Werte dann mit der beschriebenen Architektur über die URL an die Einspielkomponente übetragen werden. Zur Einspielseite gibt es einen eigenen Artikel.

Die Aktivierung der neuen Seitentypen ist denkbar einfach. Erst einmal wird die erwähnte Assembly aus dem Installationsverzeichnis in alle _app_bin Unterverzeichnisse der WSS Sites kopiert, in denen eine Nutzung erwünscht ist. Ist nur eine Site installiert, so wird diese üblicherweise an den HTTP Defaultport 80 gebunden und das Verzeichnis dieser WSS Site findet sich normalerweise in c:\Inetpub\wwwroot\wss\VirtualDirectories\80 – die 80 ist der zugeordnete Port. Im Installationsverzeichnis findet sich neben der Assembly auch ein Source Unterverzeichnis mit den Quelltexten für die neuen Seitentypen. Zusätzlich sind dort im Fragments Unterverzeichnis einige Dateischnipsel angelegt, mit denen die manuelle Einrichtung vorgenommen werden kann. Die Datei MUpload.ASPX wird so wie sie ist ins Seitenverzeichnis von WSS 3.0 kopiert – üblicherweise c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS.

Damit ist die erste Phase er Einrichtung abgeschlossen. An WSS selbst wurde noch nichts verändert, lediglich zusätzliche Funktionalität bereitgestellt. Diese wird aber noch nicht genutzt.

So long

Jochen

Windows SharePoint Services 3.0: Multi-File Upload

Ich habe mich kürzlich ein wenig mit den (nur leicht veralteten) Windows SharePoint Services 3.0 unter Windows 2003 auseinandergesetzt. Für eine sehr spezielle Anforderungen habe ich ein kleines Proof-Of-Concept gemacht, das alles andere als rund oder unmittelbar produktiv nutzbar ist, aber vielleicht dem einen oder anderen wenn nicht hilft so doch auf Ideen bringt, wie man mit diesem Szenario umgeht.

Konkret geht es um die Möglichkeit, in einer Document Library mehrere Dateien auf einmal einzuspielen.

Menu       Standardupload

Sind in der Document Library Pflichtspalten definiert, so werden zwar alle Dateien eingespielt, sind aber ausgecheckt und müssen zur endgültigen Freigabe einzeln bearbeitet werden. Das kann gerade beim Einspielen sehr vieler Dateien lästig sein, vor allem, wenn die zu vergebenden Pflichteigenschaften identische Werte besitzen.

Mein kleines Projekt greift in den Einspielvorgang für mehrere Dateien ein. Durch Konfiguration ist es möglich, auf dem Auswahlformular Felder der Library direkt einzugeben, die dann bei allen Dateien gesetzt werden. Im aktuellen Zustand hat das Ganze noch eine Reihe von Ecken und Kanten, aber es ist eine extrem kleine Lösung mit wenigen Codezeilen und ein bißchen HTML. Eleganz braucht vielleicht nur noch etwas Zeit.

Ein aktueller Download (die Nutzung erfolgt wie üblich bei Software von dieser Site völlig ohne Gewähr und auf eigene Gefahr) mit sämtlichen Quelltexten (viel ist es wie gesagt nicht) findet sich hier. Die Installation kopiert ausschließlich Dateien und verändert nichts an dem System. Sie kann auf daher jedem Rechner erfolgen, es muss keine WSS 3.0 Installation vorliegen (lediglich das Microsoft .NET 3.0 Framework wird vorausgesetzt – das machte es mir etwas einfacher, aber ich denke, dass ist schon fast Standard). Das Einrichten im WSS erfolgt manuell. Ich habe versucht, das Vorgehen in einzelnen Artikeln zu beschreiben, wobei auch auf einige der Ecken, Kanten und Fallstricke eingegangen wird.

Schritt 1: Bereitstellen des neuen Seitentyps.
Schritt 2: Vorbereiten der Auswahlseite.
Schritt 3: Konfiguration der zusätzlichen Felder pro Library.

Viel Spaß

Jochen

.NET 3.5 SP1 und ASP.NET Run-Time Hosting

VCR.NET ist ein Windows Dienst, der sich als ASP.NET Web Server präsentiert. Kern dazu ist eine Implementierung der HttpWorkerRequest Basisklasse. Die ursprüngliche Realisierung beschränkte sich auf das Notwendigste, i.e. die Methoden, die im Betrieb auch tatsächlich aufgerufen wurden. Seit SP1 von .NET 3.5 wird nun leider auch die Methode void SendResponseFromFile( string filename, long offset, long length ) für statische Inhalte verwendet (Bilder, HTML, CSS, …), was im konkreten Fall von VCR.NET dazu führte, dass die Anwendung zwar noch lief, aber sehr komisch aussah.

Glücklicherweise ist zumindest eine dumme Implementierung der Methode recht trivial, aber man muss es halt erst einmal tun. Wer also auch ASP.NET Run-Time Hosting betreibt und sich auf eine Minimalimplementierung stützt: lieber mal reinschauen, bevor es eine optisch unschöne Überraschung gibt.

Viel Spaß

Jochen

DVB.NET 3.5 und DVB-S2

Ich habe mir gerade eine Hauppauge Nova-HD-S2 eingebaut und festgestellt, dass die Senderliste von DVB.NET 3.5 für eine Unterstützung von DVB-S2 unzureichend ist. DVB.NET 3.5 weiß von einem Transponder zwar, dass es sich um einen DVB-S2 Transponder handelt, kennt aber weder Modulationsverfahren noch RollOff oder Pilot Parameter. Im Gegensatz zur TechnoTrend S2-3200 benötigt die Nova-HD-S2 diese Informationen aber zum Teil. Da gibt es auch keinen Work-Around, sondern nur ein weiteres Tüpfelchen für die Senderverwaltung von DVB.NET 4.0 (tatsächlich hatte ich das schon berücksichtigt, ohne die Details zu kennen).

Ausserdem ist die Nova pingeliger, was die Angabe der Fehlerkorrektur angeht. In DVB.NET 3.5 hat sich bezüglich des neuen Arte HD Transponders ein Fehler eingeschlichen: die FEC ist mit 3/4 vermerkt, korrekt ist aber 2/3. Glücklicherweise läßt sich das manuell für DVB.NET und VCR.NET korrigieren.

Immerhin: mit etwas Tricks erscheint nun Arte HD auch mit der Nova.

So long

Jochen