ASP (Active Server Page) est un produit de Microsoft Parce qu'il est facile à programmer et permet de développer rapidement des sites Web dynamiques dotés de fonctionnalités puissantes, de nombreux sites Web (notamment les intranets intranet/extranet) adoptent désormais le modèle NT+IIS+ASP, faisant d'ASP le modèle incontournable. current Le langage de script le plus populaire pour le développement de sites Web. Dans les services WEB, le service de téléchargement de fichiers est une fonction très courante, mais PWS sous WIN9X ne fournit pas de composants associés ; IIS sous NT fournit un Post ; Composant accepteur, mais il n'est pas facile à utiliser car il vérifie les droits d'accès au WWW de l'utilisateur ; vous pouvez également télécharger des composants associés depuis Internet, mais la plupart d'entre eux sont des composants commerciaux, et ceux utilisés pour le téléchargement sont des versions d'essai. heure ou Il existe des restrictions sur la fonctionnalité. Étant donné qu'ASP peut appeler des composants OLE/COM standard, nous pouvons utiliser des outils de programmation avancés tels que VB/VC/DELPHI pour personnaliser nos propres composants de téléchargement de fichiers ASP en fonction de nos propres exigences afin de répondre aux exigences de notre propre système d'application.
Ce qui suit discutera du principe et du processus de mise en œuvre spécifique de l'utilisation de DELPHI pour développer des composants de téléchargement de fichiers pour ASP.
1. Principe de mise en œuvre du téléchargement de fichiers
Le téléchargement de données sur le Web doit être conforme à la norme RFC1867, et les données de fichiers téléchargées ne font pas exception. Par exemple, utilisez le fichier de page HTML suivant (delphiup.htm) pour sélectionner le fichier de téléchargement :
<!-- DelphiUp.htm : Interface de téléchargement de fichiers -->
<html><head><title>Téléchargement de fichiers</title></head><body>
Implémenter le téléchargement de fichiers à l'aide du composant de téléchargement de fichiers écrit en DELPHI
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>Enregistrer le fichier sous : <input TYPE=text NAME="SaveAs">
<p>Veuillez sélectionner le fichier à télécharger : <input TYPE=file NAME="FileData">
<input type="submit" name="b1" value="Confirmer le téléchargement"> </p>
</form>
</body></html>
Lorsque le client sélectionne un fichier (tel que Test.TXT, dont le contenu est "Voici le contenu d'un fichier à télécharger.") et appuie sur
Une fois que le bouton « Confirmer le téléchargement » a soumis les données, les données reçues par le programme côté serveur auront la forme suivante :
--------------------------7cf1d6c47c#13#10
Contenu-Disposition : formulaire-données name="Enregistrer sous"#13#10#13#10
NouveauNomFichier#13#10
--------------------------7cf1d6c47c#13#10
Contenu-Disposition : form-data ; nom="FileData" ; nom de fichier="D : est.txt"
Type de contenu : texte/plain#13#10#13#10
Voici le contenu d'un fichier à télécharger. #13#10
--------------------------7cf1d6c47c#13#10
Contenu-Disposition : form-data name="b1"#13#10#13#10
Confirmer le téléchargement#13#10
--------------------------7cf1d6c47c--
Parmi eux, "--------------------------------7cf1d6c47c" est le délimiteur utilisé pour séparer chaque champ du formulaire ( Formulaire);
#13#10 est la représentation DELPHI des caractères de retour chariot et de saut de ligne. Nous pouvons y penser de cette façon, la description des informations de chaque champ du formulaire commence par un délimiteur plus une paire de retours chariot et de sauts de ligne #13#10 ; le nom de domaine du formulaire commence par "name="" et se termine par """ ; ; le champ du formulaire La valeur commence par deux paires de caractères de retour chariot et de saut de ligne #13#10#13#10, et se termine par une paire de caractères de retour chariot et de saut de ligne #13#10# plus un délimiteur ; commence par "filename="" et se termine par """ pour la fin. Avec ces indicateurs, nous pouvons obtenir le nom et la valeur du champ du formulaire ainsi que le nom du fichier à télécharger, afin que les données du fichier puissent être lues et stockées.
2. Processus de mise en œuvre du téléchargement de fichiers
Après avoir compris le format de données mentionné ci-dessus, il ne nous est plus difficile d'écrire nous-mêmes un composant de téléchargement de fichiers.
(1) Démarrer un projet pour créer un composant ASP
Si vous n'êtes pas familier avec les étapes d'utilisation de DELPHI pour développer OLE Automation Server, veuillez vous référer à l'article « Utilisation de DELPHI pour développer OLE Automation Server pour ASP » dans « Electronique et ordinateurs », numéro 06, 1999.
Ici, nous présentons seulement brièvement les étapes.
1. Créez un projet de bibliothèque ActiveX
Dans DELPHI, sélectionnez le menu Fichier="Nouveau..., sélectionnez "Bibliothèque ActiveX" dans l'onglet ActiveX de la boîte de dialogue "Nouvel élément", et DELPHI créera automatiquement un projet DLL PRoject1.
2. Créer des composants d'automatisation
Dans DELPHI, sélectionnez le menu Fichier="Nouveau..., sélectionnez "Objet d'automatisation" dans l'onglet ActiveX de la boîte de dialogue "Nouvel élément" ; puis saisissez le nom de la classe (tel que "UploadFile") dans l'assistant "Objet d'automatisation". "Boîte de dialogue, Instanciation, sélectionnez "Multiple Instance". Après avoir cliqué sur "OK", DELPHI créera automatiquement un fichier TLB (Type Library) Project1_TLB.PAS et un fichier PAS (Unit) Unit1.PAS. Dans la fenêtre de conception de la bibliothèque de types, renommez Project1 en MyUpload, le code d'enregistrement OLE du composant de téléchargement de fichiers est alors « MyUpload.UploadFile ».
3. Présentation de la bibliothèque de types ASP
Afin d'utiliser les cinq objets intégrés d'ASP (Requête, Réponse, Serveur, application, session), la bibliothèque de types ASP doit être introduite. Nous utilisons principalement l'objet Request pour lire les données transmises du client au serveur.
Sélectionnez « Importer une bibliothèque de types » dans le menu Projet, puis sélectionnez « Bibliothèque d'objets Microsoft Active Server Pages (version) » dans la liste « Bibliothèques de types » de la boîte de dialogue « Importer une bibliothèque de types ». 2.0)" (Si cette option n'est pas disponible, assurez-vous que IIS3 ou supérieur ou PWS4 ou supérieur est installé sur votre ordinateur et qu'ASP.DLL a été correctement enregistré), D ELPHI créera automatiquement un fichier TLB ASPTypeLibrary_TLB.PAS, qui contient la déclaration de type d'objet ASP dont nous avons besoin.
4. Définir les processus OnStartPage et OnEndPage
Lors de l'utilisation de Server.CreateObject pour créer une instance d'objet OLE sur une page ASP, le serveur WEB appellera sa méthode OnStartPage et transmettra les informations de l'environnement d'application ASP à l'objet. , nous pouvons obtenir les informations du client au cours de ce processus ; lorsqu'une instance d'objet OLE est libérée dans la page ASP, le serveur WEB appellera sa méthode OnEndPage, et nous pouvons effectuer des opérations de fin telles que libérer de la mémoire pendant ce processus. Dans notre composant, nous devons utiliser sa méthode OnStartPage.
La méthode OnStartPage doit être définie dans Unit1.PAS. Le prototype de fonction de OnStartPage est :
procédure OnStartPage(AScriptingContext: IUnknown);
Le paramètre AScriptingContext est une variable de type IScriptingContext, comprenant cinq attributs (Request, Response, Server, Application, Session) correspondant à cinq objets intégrés de même nom dans ASP.
Nous devons ajouter la méthode OnStartPage à IUploadFile dans la fenêtre de définition TLB (View="Type Library) et son instruction de déclaration est "procedure OnStartPage(AScriptingContext: IUnknown);".
(2) Extraire les données téléchargées par le client
Ce travail peut être effectué dans le processus OnStartPage.
À l'aide de la propriété TotalBytes (longueur du contenu des informations de la demande) et de la méthode BinaryRead dans la propriété Request (type IRequest) de AScriptingContext, les données d'informations de la demande téléchargées par le client peuvent être lues dans un tableau de type Byte, puis dans le format de données défini par la RFC1867. standard pour analyser et extraire des données.
1. Définissez d'abord plusieurs variables privées de TUploadFile
Ajouter une référence à ASPTypeLibrary_TLB.PAS (Uses) dans le fichier unité UP01.PAS (enregistré par Unit1.PAS),
alors rejoignez
privé
FContentLength : LongInt ; //Demande la longueur du contenu des informations
FContentData : Variant ; //Données de contenu, stocke le contenu des informations de la demande sous la forme d'un tableau
FFileName, //Le nom du fichier à télécharger
FDelimeter : string ; //Délimiteur de champ de formulaire
FScriptingContext : IScriptingContext ; // ASP traite le contenu contextuel
FFileDataStart, //Position de départ des données du fichier
FFileDataEnd : LongInt ; //Position de fin des données du fichier
2. Extrayez les données d'informations de demande téléchargées par le client
//Dans l'événement OnStartPage, obtenez les informations de contexte ASP, le contenu des informations de demande, les délimiteurs de champs de formulaire et les données de fichier
procédure TUploadFile.OnStartPage(AScriptingContext: IUnknown);
var
ARequest : IRequest ; //Objet de requête WWW
AOleVariant : OleVariant ; //Enregistre la longueur du contenu des informations de la demande
intDelimterLength : entier;//Longueur du délimiteur
longIndex,ALongInt,longPos : LongInt;
ContentData : AnsiString ; // Représentation sous forme de chaîne du contenu des informations de la demande
strTemp : chaîne ;
FindEndOfFileData : boolean ;//Si la position finale des données du fichier est trouvée
commencer
//Extraire les données d'informations de demande téléchargées par le client
FScriptingContext := AScriptingContext as IScriptingContext;//Obtenir des informations de contexte ASP
ARequest := FScriptingContext.Request;//Obtenir les informations de la demande WWW
FContentLength := ARequest.TotalBytes ; // Demander la longueur du contenu des informations
//Créer un tableau dynamique pour stocker le contenu des informations de la requête sous la forme d'un tableau
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//Stocke le contenu des informations de la requête dans le tableau
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//Lire le contenu des informations de la demande
// Convertit le contenu des informations de la demande en chaîne pour un positionnement facile
ContenuDonnées := ';
pour longIndex := 0 à FContentLength - 1 faire
commencer
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
si FContentData[ longIndex ] = 0 alors break;//0 indique la fin du contenu
fin;
3. Obtenez le délimiteur et téléchargez le nom du fichier
//Récupère le délimiteur du champ du formulaire
longPos := pos( #13#10,ContentData );//La position du caractère de retour chariot et de saut de ligne
FDelimeter := Copy( ContentData,1,longPos-1);//Le contenu avant cette position est le délimiteur
//Obtenir le nom du fichier avec le chemin source. Dans le contenu des informations de la demande, le nom du fichier commence par.
//Stockage sous la forme filename="path/filename"
strTemp := 'filename="';//Le nom du fichier est après "filename=""
longPos := pos( strTemp, ContentData );//Obtenir la position "filename=""
si longPos <= 0 alors
commencer
FFileName := ';
FFileDataStart := -1;
FFileDataEnd := -2;
sortie;
fin;
//Récupère le contenu avant le prochain guillemet """, c'est-à-dire le nom du fichier avec le chemin source
longPos := longPos + longueur( strTemp );
strTemp := ';
pour longIndex := longPos à FContentLength - 1 faire
si ContentData[ longIndex ] <> '"' alors
strTemp := strTemp + ContentData[ longIndex ]
sinon pause;
FFileName := strTemp;
4. Obtenez les positions de début et de fin des données du fichier dans le contenu des informations de la demande
//La position de départ des données du fichier est après le premier #13#10#13#10 après le nom du fichier
supprimer (ContentData, 1, longIndex );
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;
//La position de fin des données du fichier est avant le prochain #13#10 et le délimiteur
//Étant donné que les données du fichier peuvent contenir des caractères illégaux, la fonction de positionnement de chaîne POS ne peut plus être utilisée.
//Trouver la position du prochain délimiteur
FFileDataEnd := FFileDataStart;
intDelimterLength := length( FDelimeter );
FindEndOfFileData := faux;
while FFileDataEnd <= FContentLength - intDelimterLength faire
commencer
FindEndOfFileData := vrai;
pour ALongInt := 0 à intDelimterLength - 1 faire
if Byte( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[FFileDataEnd + ALongInt] puis
commencer
FindEndOfFileData := faux;
casser;
fin;
si FindEndOfFileData alors break ;
FFileDataEnd := FFileDataEnd + 1 ;
fin;
sinon FindEndOfFileData alors FFileDataEnd := FFileDataStart - 1//Aucun délimiteur trouvé
else FFileDataEnd := FFileDataEnd - 3;//Délimiteur, avancer #13#10
fin;
(3) Transmettre les informations au programme ASP
Après avoir effectué l'opération (2), notre composant de téléchargement peut transmettre les données au programme ASP selon ses exigences. Les données actuellement disponibles incluent : le nom du fichier source du client (FFileName, y compris le chemin), la taille du fichier (FFileDataEnd-FFileDataStart+1).
Tout d’abord, les deux méthodes suivantes GetFileName et GetFileSize doivent être déclarées dans la fenêtre de conception TLB.
1. Renvoyez le nom du fichier source du client (y compris le chemin)
//Renvoie le nom du fichier source du client (y compris le chemin)
fonction TUploadFile.GetFileName : OleVariant ;
commencer
result := FFileName;//Nom du fichier source du client (y compris le chemin)
fin;
2. Renvoie la taille du fichier
// Renvoie la taille du fichier (octets)
fonction TUploadFile.GetFileSize : OleVariant ;
commencer
résultat := FFileDataEnd - FFileDataStart + 1 ;
fin;
(4) Enregistrer les fichiers
Après avoir effectué l'opération (2), notre composant de téléchargement peut enregistrer le fichier selon les exigences du programme ASP. D'abord, il devrait être dans
Les deux méthodes suivantes, SaveFileAs et SaveFile, sont déclarées dans la fenêtre de conception TLB.
1. Enregistrez le fichier selon le nom de fichier spécifié
//Enregistrez le fichier selon le nom de fichier spécifié. Le paramètre FileName est le nom de fichier spécifié. La valeur de retour True indique que le fichier est enregistré avec succès.
fonction TUploadFile.SaveFileAs(FileName : OleVariant) : OleVariant ;
var
indexlong : LongInt;
AFile : fichier d'octet ;//Enregistre le fichier sous forme binaire
byteData : Octet ;
commencer
résultat := vrai;
essayer
assigner(AFile, FileName);
réécrire (AFile);
pour longIndex := FFileDataStart à FFileDataEnd faire
commencer
byteData := Byte( FContentData[ longIndex ] );
Écrire (AFile, byteData);
fin;
CloseFile(AFile);
sauf
résultat := faux;
fin;
fin;
2. Enregistrez le fichier avec le nom de fichier par défaut
//Enregistrez le fichier selon le nom de fichier par défaut et enregistrez le fichier sous le même nom dans le répertoire où se trouve la page appelante
fonction TUploadFile.SaveFile : OleVariant ;
var
CurrentFilePath : chaîne ;
commencer
//Récupère le répertoire où se trouve la page appelante
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
CurrentFilePath := ExtractFilePath( CurrentFilePath );
//sauvegarder le fichier
résultat := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
fin;
3. Exemples d'application de composants de téléchargement
Dans notre exemple, DelphiUp.HTM est l'interface de téléchargement de fichiers et DelphiUp.ASP est utilisé pour effectuer les opérations de téléchargement de fichiers.
Le code de DelphiUp.ASP est le suivant :
<!--DelphiUp.ASP : Page de traitement du téléchargement des fichiers-->
<html><head><title>Téléchargement de fichiers</title></head><body>
<% dim Téléchargement, NomFichier
set Upload = Server.CreateObject("MyUpload.UploadFile")
FileName = Upload.GetFileName
Response.Write "<br>Enregistrement du fichier ""&FileName&""..."
si Upload.SaveFile alors
Response.Write "<br>Le fichier ""&FileName&"" a été téléchargé avec succès."
Response.Write "<br>La taille du fichier est de "&Upload.GetFileSize&" octets."
autre
Response.Write "<br>Le fichier ""&FileName&"" n'a pas pu être téléchargé."
finir si
set Upload=rien %>
</body></html>
4. Quelques explications
1. La taille du fichier DLL compilé à partir du code source généré automatiquement par DELPHI est de 215 Ko, disponible dans
Dans la section Interface de ASPTypeLibrary_TLB.PAS, supprimez toutes les unités dans Uses sauf ActiveX.
En supprimant toutes les unités dans Uses dans MyUpload_TLB.PAS, la taille du fichier DLL généré peut être réduite à 61 Ko.
2. La méthode ci-dessus est également applicable aux programmes CGI, mais l'objet TWebRequest doit être utilisé.
Le programme ci-dessus a été débogué et passé sous PWIN98+Delphi3.0+PWS4.0.