Überblick
In diesem Artikel wird ein Beispiel für die Verwendung der XML-Technologie zum Hochladen von Dateien erläutert. Diese Methode weist nicht die Einschränkungen herkömmlicher Methoden auf. In diesem Beispiel wird beschrieben, wie Sie MSXML3.0 und das ADO-Stream-Objekt verwenden, um diese neue Upload-Methode zu implementieren. Es gibt viele Vorteile, zum Beispiel, dass keine spezielle Upload-Komponente erforderlich ist.
Einführung
Um die Upload-Funktion in HTML-Webseiten zu erhalten, können wir auf dem Client das folgende Format von FORM verwenden:
<FORM NAME="myForm"
ACTION="TargetURL.asp"
ENCTYPE="multipart/form-data"
METHOD="post">
<INPUT TYPE="file" NAME="myFile">
<INPUT TYPE="submit" VALUE="Datei hochladen">
</FORM>
Diese Lösung weist viele Einschränkungen hinsichtlich der Verwendung sowohl des Clients als auch des Servers auf. Zuerst müssen wir die POST-Methode verwenden, da die GET-Methode solche Formulardaten nicht verarbeiten kann. Außerdem gibt es keine Möglichkeit, eine POST-Aktion auszulösen, ohne ein Formular zu verwenden. Nach dem Senden der Daten an den Formular-Handler lädt der Browser den Handler als neue Seite und der Benutzer sieht einen unangenehmen Seitenübergang.
Das ENCTYPE-Attribut definiert die MIME-Kodierungsmethode für das Formular. Das ENCTYPE-Attribut des Formulars zum Hochladen von Dateien muss „multipart/form-data“ verwenden. Wenn Sie dieses Attribut auf „multipart/form-data“ setzen, wird ein POST-Puffer (zusammengesetzte Struktur) erstellt, der sich von der herkömmlichen Struktur unterscheidet. Das ASP-Request-Objekt kann nicht auf solche Formularinhalte zugreifen. Wir können also die Methode „Request.binaryRead“ verwenden, um auf diese Daten zuzugreifen, aber wir können dies nicht mit einer Skriptsprache tun. Die Methode Request.binaryRead gibt Daten vom Typ VTaray zurück (ein Array vom Typ Variant, das nur vorzeichenlose Ein-Byte-Zeichen enthält). Aber Skriptsprachen können nur Variant-Daten verarbeiten. Um dieses Problem zu lösen, können Sie nur dedizierte ASP-Upload-Komponenten oder ISAPI-Erweiterungen wie CPSHOST.DLL verwenden. Dies ist eine Designbeschränkung.
Der neue Upload-Plan
muss die folgenden Schritte befolgen.
Client:
Verwenden Sie MSXML 3.0, um einen XML-Knoten für binäre Inhalte zu erstellen. Verwenden Sie das XMLHTTP-Objekt, um das XML-Dokument an den Webserver zu senden
. Seite:
Lesen Sie das XML-Dokument aus dem Request-Objekt, lesen Sie die Daten im Binärknoten und speichern Sie sie in einer Datei auf dem Server. Natürlich können wir es auch in einem BLOB-Feld in der Datenbank speichern.
Bevor wir diesen Code erklären, können wir über diese Lösung nachdenken.
Gedanken zu XML
Das XML-Format unterstützt viele Datentypen, z. B. numerisch, Gleitkommazahlen, Zeichen usw. Viele Autoren definieren XML als ASCII-Format, wir können jedoch nicht ignorieren, dass die XML-Technologie auch den Datentyp „bin.base64“ zur Beschreibung binärer Informationen verwenden kann. Diese Funktion wird im MS XML3.0-Parser vollständig unterstützt, erfordert jedoch derzeit einige spezielle Einstellungen. Dieses Objekt stellt einige Eigenschaften bereit, die eine vollständige Kontrolle über Binärdaten ermöglichen:
obj_node.dataType – Diese Lese-/Schreibeigenschaft definiert den Datentyp eines bestimmten Knotens. Der MSXML-Parser unterstützt weitere Datentypen (siehe MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
Für Binärdaten können wir den Typ „bin.base64“ verwenden.
obj_node.nodeTypedValue – Diese Lese-/Schreibeigenschaft enthält Daten, die den angegebenen Knoten im Hinblick auf den angegebenen Typ darstellen.
Wir können ein XML-Dokument erstellen, das mehrere Knoten vom Typ bin.base64 enthält, die hochgeladene Dateien enthalten. Mit dieser Funktion können Sie mehrere Dateien gleichzeitig mit einem POST hochladen.
Wir können das XMLHttpRequest-Objekt und die POST-Methode verwenden, um ein XML-Dokument an den Webserver zu senden. Dieses Objekt bietet clientseitige Protokollunterstützung für den HTTP-Server und ermöglicht das Senden und Empfangen von MS XMLDOM-Objekten auf dem Webserver. XMLHttpRequest ist ein integriertes COM-Objekt in Internet Explorer 5 (keine benutzerdefinierte Installation erforderlich) und es besteht keine Notwendigkeit, die Seite nach dem Senden zu konvertieren.
Nachdenken über das ADO-Stream-Objekt
Wir können auf der Clientseite ein XML-Dokument erstellen, das einen oder mehrere Binärknoten enthält. Wir müssen den Knoten auch mit den Dateiinhalten füllen. Leider können Skriptsprachen nicht auf das lokale Dateisystem zugreifen und das Scripting.FileSystem-Objekt (ein integriertes Objekt des Win32-Systems) konnte bisher nicht auf Binärdateien zugreifen. Dies ist eine Designbeschränkung. Wir müssen also ein anderes COM-Objekt finden, das Zugriff auf lokale Binärdateien ermöglicht.
Das ADO-Stream-Objekt (Komponente in MDAC 2.5) bietet die Möglichkeit, binäre Stream-Daten zu lesen, zu schreiben und zu verwalten. Der Inhalt des Bytestreams kann Text oder Binärdaten sein und es gibt keine Kapazitätsbeschränkung. In ADO 2.5 gehört das von Microsoft eingeführte Stream-Objekt zu keiner Ebene der ADO-Objektstruktur, sodass wir das Objekt ohne Bündelung verwenden können.
In diesem Artikel wird das Stream-Objekt verwendet, um auf den Dateiinhalt zuzugreifen, und dann wird der Inhalt im XML-Knoten gespeichert.
auf der Clientseite
verwendet Stream- und MSXML-Objekte, um den Datei-Upload-Vorgang abzuschließen.
<HTML>
<HEAD><TITLE>Datei senden</TITLE></HEAD>
<KÖRPER>
<INPUT id=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>Bereit</DIV>
</BODY>
</HTML>
<SCRIPT LANGUAGE=javascript>
// Upload-Funktion
Funktion btn_send.onclick()
{
//ADO-Stream-Objekt erstellen
var ado_stream = new ActiveXObject("ADODB.Stream");
/ Erstellen Sie ein XML-Dokument mit Standard-Header-Informationen und Root-Knoten
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
//Datentyp angeben
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// Einen neuen Knoten erstellen und ihn als binären Datenknoten festlegen
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
//Öffnen Sie das Stream-Objekt und lesen Sie die Quelldatei
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\myfile.doc");
//Dateiinhalt im XML-Knoten speichern
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// Sie können mehrere Binärknoten erstellen und mehrere Dateien gleichzeitig hochladen
// Das XML-Dokument an den Webserver senden
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// Zeigt die vom Server zurückgegebenen Informationen an
div_message.innerHTML = xmlhttp.ResponseText;
}
</SCRIPT>
auf der Serverseite
verwendet dasselbe Objekt, um serverseitige Upload-Verarbeitungsfunktionen bereitzustellen.
<%@ LANGUAGE=VBScript%>
<% Option explizit
Response.Expires = 0
' Variablen und Objekte definieren.
dim ado_stream
dimxml_dom
dim xml_file1
'Stream-Objekt erstellen
set ado_stream = Server.CreateObject("ADODB.Stream")
' Erstellen Sie ein XMLDOM-Objekt aus dem Request-Objekt
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(Anfrage)
'Knoten lesen, die Binärdaten enthalten
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Öffnen Sie das Stream-Objekt und speichern Sie die Daten darin
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'Datei speichern
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' Objekt zerstören
setze ado_stream = Nichts
set xml_dom = Nichts
'Informationen an den Browser zurückgeben
Response.Write „Upload erfolgreich!“
%>
Sie können das Stream-Objekt auch verwenden, um Daten in das BLOB-Feld der Datenbank einzufügen.
Der Vorteil dieser Methode besteht darin, dass
sie keine Seitenkonvertierungen verursacht.
Es sind keine besonderen Komponenten erforderlich.
Es können mehrere Dateien gleichzeitig hochgeladen werden.
Dieses Programm ist in reinem Skript geschrieben und kann ohne Mitwirkung von HTML-Objekten problemlos in andere Codes eingefügt werden. Diese Logik kann auch in jeder Sprache implementiert werden, die den COM-Standard unterstützt.
Überlegungen zur Systemsicherheit:
Diese Methode kann nur in internen Netzwerken verwendet werden, da hierfür die Sicherheitsstufe von IE5 auf „Niedrig“ eingestellt sein muss. Erforderlich:
Skripte und ActiveX-Objekte zulassen. Mit dieser Einstellung kann der Browser JScript-Anweisungen wie „myobj = new activexobject(...)“ ausführen.
Der domänenübergreifende Zugriff auf die Datenquelle muss erlaubt sein. Diese Einstellung ermöglicht die Verwendung von Stream-Objekten auf der Clientseite. Sowohl auf dem Server als auch auf dem Client müssen außerdem MS XML DOM 3.0 und MDAC 2.5 installiert sein.