Aperçu
Cet article explique un exemple d'utilisation de la technologie XML pour télécharger des fichiers. Cette méthode ne présente pas les limitations des méthodes traditionnelles. Cet exemple décrit comment utiliser MSXML3.0 et l'objet ADO Stream pour implémenter cette nouvelle méthode de téléchargement. Les avantages sont nombreux, comme l’absence de composant de téléchargement dédié.
introduction
Afin d'obtenir la fonction de téléchargement dans les pages Web HTML, nous pouvons utiliser le format FORM suivant sur le client :
<FORM NAME="myForm"
ACTION="URLCible.asp"
ENCTYPE="multipart/form-data"
MÉTHODE="post">
<INPUT TYPE="fichier" NAME="monFichier">
<INPUT TYPE="submit" VALUE="Télécharger le fichier">
</FORM>
Cette solution présente de nombreuses limitations sur l'utilisation du client et du serveur. Tout d’abord, nous devons utiliser la méthode POST car la méthode GET ne peut pas gérer de telles données de formulaire. De plus, il n’existe aucun moyen de déclencher une action POST sans utiliser de formulaire. Après avoir envoyé les données au gestionnaire de formulaire, le navigateur chargera le gestionnaire en tant que nouvelle page et l'utilisateur verra une transition de page désagréable.
L'attribut ENCTYPE définit la méthode de codage MIME du formulaire. L'attribut ENCTYPE du formulaire de téléchargement de fichiers doit utiliser "multipart/form-data". La définition de cet attribut sur « multipart/form-data » crée un tampon POST (structure composite) différent de la structure traditionnelle. L'objet Request d'ASP ne peut pas accéder à ce contenu de formulaire. Nous pouvons donc utiliser la méthode Request.binaryRead pour accéder à ces données, mais nous ne pouvons pas le faire en utilisant un langage de script. La méthode Request.binaryRead renvoie des données de type VTaray (un tableau de type Variant contenant uniquement des caractères non signés d'un octet). Mais les langages de script ne peuvent gérer que les données Variant. Afin de résoudre ce problème, vous ne pouvez utiliser que des composants de téléchargement ASP dédiés ou des extensions ISAPI, telles que CPSHOST.DLL. Il s'agit d'une limitation de conception.
Le nouveau plan de téléchargement
doit suivre les étapes suivantes.
Client :
utilisez MSXML 3.0 pour créer un document XML. Créez un nœud XML pour le contenu binaire. Utilisez l'objet ADO Stream pour placer les données du fichier téléchargé dans le nœud. Utilisez l'objet XMLHTTP pour envoyer le document XML au serveur Web
. côté:
Lisez le document XML à partir de l'objet Request, lisez les données dans le nœud binaire et stockez-les dans un fichier sur le serveur. Bien entendu, nous pouvons également le stocker dans un champ BLOB de la base de données.
Avant d'expliquer ce code, nous pouvons réfléchir à cette solution.
Réflexions sur XML
Le format XML prend en charge de nombreux types de données, tels que numériques, flottants, caractères, etc. De nombreux auteurs définissent XML comme format ASCII, mais nous ne pouvons ignorer que la technologie XML peut également utiliser le type de données « bin.base64 » pour décrire des informations binaires. Cette fonctionnalité est entièrement prise en charge dans l'analyseur MS XML3.0, mais nécessite actuellement certains paramètres spéciaux. Cet objet fournit certaines propriétés qui permettent un contrôle total sur les données binaires :
obj_node.dataType - Cette propriété en lecture-écriture définit le type de données d'un nœud spécifique. L'analyseur MSXML prend en charge davantage de types de données (voir MSDN : http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
Pour les données binaires, nous pouvons utiliser le type "bin.base64".
obj_node.nodeTypedValue - Cette propriété en lecture-écriture contient des données représentant le nœud spécifié en termes du type spécifié.
Nous pouvons créer un document XML contenant plusieurs nœuds de type bin.base64, qui contiennent des fichiers téléchargés. Cette fonctionnalité vous permet de télécharger plusieurs fichiers à la fois en utilisant un seul POST.
Nous pouvons utiliser l'objet XMLHttpRequest et la méthode POST pour envoyer un document XML au serveur Web. Cet objet fournit une prise en charge du protocole côté client au serveur HTTP, permettant aux objets MS XMLDOM d'être envoyés et reçus sur le serveur Web. XMLHttpRequest est un objet COM intégré dans Internet Explorer 5 (aucune installation personnalisée requise) et il n'est pas nécessaire de convertir la page après l'envoi.
Penser à l'objet ADO Stream
Nous pouvons créer un document XML contenant un ou plusieurs nœuds binaires côté client. Nous devons également remplir le nœud avec le contenu du fichier. Malheureusement, les langages de script ne peuvent pas accéder au système de fichiers local et l'objet Scripting.FileSystem (un objet intégré du système Win32) n'a pas encore pu accéder aux fichiers binaires. Il s'agit d'une limitation de conception. Nous devons donc trouver un autre objet COM pouvant donner accès aux binaires locaux.
L'objet ADO Stream (composant de MDAC 2.5) fournit les moyens de lire, d'écrire et de gérer les données de flux binaire. Le contenu du flux d'octets peut être du texte ou des données binaires, et il n'y a aucune limite de capacité. Dans ADO 2.5, l'introduction par Microsoft de l'objet Stream n'appartient à aucune couche de la structure de l'objet ADO, nous pouvons donc utiliser l'objet sans regroupement.
Dans cet article, l'objet Stream est utilisé pour accéder au contenu du fichier, puis le contenu est stocké dans le nœud XML.
côté client
utilise les objets Stream et MSXML pour effectuer l'action de téléchargement de fichier.
<HTML>
<HEAD><TITLE>Envoyer un fichier</TITLE></HEAD>
<CORPS>
<INPUT id=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>Prêt</DIV>
</CORPS>
</HTML>
<SCRIPT LANGUAGE=javascript>
// Fonction de téléchargement
fonction btn_send.onclick()
{
//Créer un objet flux ADO
var ado_stream = new ActiveXObject("ADODB.Stream");
// Crée un document XML contenant les informations d'en-tête par défaut et le nœud racine
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
// Spécifier le type de données
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// Créez un nouveau nœud et définissez-le comme nœud de données binaires
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64" ;
//Ouvrez l'objet Stream et lisez le fichier source
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\monfichier.doc");
//Enregistrer le contenu du fichier dans le nœud XML
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// Vous pouvez créer plusieurs nœuds binaires et télécharger plusieurs fichiers à la fois
// Envoyer le document XML au serveur Web
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// Afficher les informations renvoyées par le serveur
div_message.innerHTML = xmlhttp.ResponseText;
}
</SCRIPT>
côté serveur
utilise le même objet pour fournir la fonctionnalité de traitement de téléchargement côté serveur.
<%@ LANGUAGE=VBScript%>
Option <% explicite
Response.Expires = 0
'Définit les variables et les objets.
faible ado_stream
dimxml_dom
dim xml_file1
'Créer un objet Stream
set ado_stream = Server.CreateObject("ADODB.Stream")
'Créer un objet XMLDOM à partir de l'objet Request
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load (demande)
'Lire les nœuds contenant des données binaires
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Ouvrez l'objet Stream et stockez-y les données
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'Enregistrement du fichier
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' Détruire l'objet
set ado_stream = Rien
set xml_dom = Rien
'Renvoyer les informations au navigateur
Réponse.Écrivez « Téléchargement réussi ! »
%>
Vous pouvez également utiliser l'objet Stream pour placer des données dans le champ BLOB de la base de données.
L’avantage d’utiliser cette méthode est qu’elle
n’entraîne pas de conversions de pages.
Aucun composant spécial n'est requis.
Plusieurs fichiers peuvent être téléchargés en même temps.
Ce programme est écrit en script pur et peut être facilement inséré dans d'autres codes sans la coopération d'objets HTML. Cette logique peut également être implémentée dans n'importe quel langage prenant en charge la norme COM.
Considérations sur la sécurité du système :
Cette méthode ne peut être utilisée que sur les réseaux internes car elle nécessite que le niveau de sécurité d'IE5 soit défini sur "faible". Obligatoire :
Autoriser les scripts et les objets ActiveX. Ce paramètre permet au navigateur d'exécuter des instructions JScript telles que "myobj = new activexobject(...)" ;
L'accès inter-domaines à la source de données doit être autorisé. Ce paramètre permet l'utilisation d'objets Stream côté client. MS XML DOM 3.0 et MDAC 2.5 doivent également être installés sur le serveur et le client.