Accueil   |   Forums   |  Offres d'emplois   |  Contact    |   Mon compte   
samedi 17 mai 2008 Rechercher :
Déposez votre CV gratuitement sur touslesemplois
 
comparer les prix
» Logiciels
» Jeux vidéos
» Matériel Informatique


» ASP.NET
» ASP
» SQL
» PHP
» JAVASCRIPT
» XML
 


» ACTUALITÉ / DIVERS
» DROIT DE L'INTERNET
» INFOS VIRUS
» PATCHS MICROSOFT
» SÉCURITÉ
» BASES DE DONNÉES
» DOWNLOAD .NET
» LOGITHÈQUE
» SERVICES WEB
» Y SONT FOUS !
» .NET
» ASP
» ASP.NET
» JAVA
» PHP
» XML
» LANGAGE C#
» LANGAGE VB.NET
» UNIX / LINUX
» WINDOWS
» EVÈNEMENTS
» GASP
» MICROSOFT
 



Vous êtes ici : Articles ASP > NOTES DE COURS

Upload de fichiers sans composant
Le but de cet article est de vous montrer comment uploader n’importe quel type de fichier sur un serveur Windows (ASP) sans avoir besoin d’un quelconque composant.


ABONNEZ-VOUS GRATUITEMENT A LA REVUE DE PRESSE "LES Z'ACTUS" ET RECEVEZ CHAQUE JOUR DANS VOTRE BOITE AUX LETTRES LA MEILLEURE INFORMATION DEDIEE AUX WEBMASTERS / DEVELOPPEURS.

Indiquez votre adresse E-mail :

Technologie : ASP 
Date : 29/05/2006   
Auteur : Nicolas Chu / Luc Chiodelli

Le concept est simple et se résume à trois phases :

  • Nous utilisons pour passer les données le contrôle Filename et l'enctype à multipart/form-data
  • Nous récupérons les données du fichier sous forme binaire grâce au Content-Type.
  • Nous écrivons sur le serveur les données sous le nom original du fichier.

1 – La récupération de données transmises par un contrôle Filename

Pour bien comprendre le concept nous utiliserons l’exemple d’un fichier texte nommé Test.txt se trouvant à l’adresse " C:\Mes documents\Test.txt " et contenant la phrase suivante : Ceci est un Mega Test

Lorsque l’on transmet le contenu de ce fichier à un serveur par le contrôle Filename et l'enctype à multipart/form-data:

<FORM METHOD="Post" ENCTYPE="multipart/form-data" ACTION="NC-Upload.asp">
<INPUT TYPE="submit" NAME="Enter" Value="UPLOAD">
<INPUT TYPE="file" NAME="FileTO" size="50">
</FORM>

Ce dernier le récupère sous la forme suivante :

-----------------------------7d037a33e8 Content-Disposition: form-data; name="Enter" UPLOAD -----------------------------7d037a33e8 Content-Disposition: form-data; name="FileTO"; filename="C:\Mes documents\Test.txt" Content-Type: text/plain Ceci est un Mega Test -----------------------------7d037a33e8—

Nous avons donc un fichier de 332 octets avec les éléments suivants :

Elément

Description

-----------------------------7d037a33e8  Séparateur
Content-Disposition: form-data  L’enctype de l’entrée est de forme form-data
Name="Enter" Le nom de l’entrée est "Enter"
UPLOAD La valeur de l’entrée est " UPLOAD "
-----------------------------7d037a33e8 Séparateur
Content-Disposition: form-data L’enctype de l’entrée est de forme form-data
Name="FileTO" Le nom de l’entrée est "FileTo"
filename="C:\Mes documents\Test.txt" Le chemin du fichier est : C:\Mes documents\Test.txt 
Content-Type: text/plain Le contenu du fichier est de type Texte
Ceci est un Mega Test Les données du fichier
-----------------------------7d037a33e8— Séparateur
---- Fin des données

2 – Description du code NC-Upload.asp :

Dim Contenu, TailleContenu, ContenuAscii, X, Y, Z, Position

---------------------------
Contenu = Request.BinaryRead(Request.TotalBytes)
TailleContenu = Request.TotalBytes

Grâce à la méthode BinaryRead on lit la totalité du post en mode binaire que l'on place dans une variable Contenu
La propriété TotalBytes nous Indique le nombre total des octets envoyés par le client dans le corps du message de requête.

-------------------
ToutOk = 0
ToutOk est une Variable Test (si tout est Ok, elle prend la valeur 1 sinon elle reste à 0

-------------------
PosDebutFic=0

PosDebutFic représente la position de l’octet où se trouve le début du Nom du fichier transmis

-------------------
PosFinFic=0

PosFinFic représente la position de l’octet où se trouve la fin du Nom du fichier transmis

-------------------
PosDebutCont=0

PosDebutCont représente la position de l’octet où se trouve le début du Content-Type du fichier

-------------------
PosFinCont=0

PosFinCont représente la position de l’octet où se trouve la fin du Content-Type du fichier

-------------------
PosDebutFic2=0

PosDebutFic2 représente la position de l’octet où se trouve le début du Contenu du fichier

-------------------
PosFinFic2=0

PosFinFic2 représente la position de l’octet où se trouve la fin du Contenu du fichier

X = 0
Y = 1
Position = 1

A/ Recherche de la position de début du Nom du fichier

En premier lieu, on recherche la position du terme filename="
Pour ce faire, on calcul le nombre d'octet (LimitBin) du premier élément jusqu'à filename=" (on effectue une boucle jusqu'au nombre d'octets correspondant au terme filename=")

LimitASCII = "filename=" & chr(34)
LimitBin=""
for Z = 1 to Len(LimitASCII)
LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, Z, 1)))
next


On recherche la position de l'octet de la chaîne Contenu jusqu’à LimitBin
On utilise la fonction InStrB qui est disponible pour être utilisée avec les données de type octet contenues dans une chaîne. Au lieu de renvoyer la position du caractère de la première occurrence d'une chaîne à l'intérieur d'une autre (fonction Instrv), la fonction InStrB renvoie la position de l'octet.

PosDebutFic = InstrB(1, Contenu, LimitBin)

-------------------
On lui ajoute ensuite la longueur du terme filename=" ce qui nous permet d'avoir la position de début du nom du fichier (PosDebutFic)

if PosDebutFic <> 0 then
PosDebutFic = PosDebutFic + LenB(LimitBin)
end if

B/ Recherche des positions de début du Content-Type et de fin du nom du fichier

-------------------
En premier lieu, on recherche la position du terme Content-Type: d'une façon similaire à notre recherche pour le terme filename="

LimitASCII = "Content-Type:"
LimitBin=""
For Z = 1 to Len(LimitASCII)
LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, Z, 1)))
next
PosDebutCont = InstrB(1, Contenu, LimitBin)

if PosDebutCont <> 0 then


-------------------
On trouve la position de la fin du nom du fichier (PosFinFic) à partir de la position du début du terme Content-Type: à laquelle on retire trois octets (un espace, une " et la première lettre du terme)

PosFinFic = PosDebutCont - 3

-------------------
On ajoute à PosDebutCont la longueur du terme Content-Type: , ce qui nous permet d'avoir la position de début du Content-Type (PosDebutCont)

PosDebutCont = PosDebutCont + LenB(LimitBin)
end if

C / Recherche du nom du fichier

-------------------
On déduit le nombre de caractères composant le nom du fichier en effectuant une soustraction

NomFichier = MidB(Contenu, PosDebutFic , (PosFinFic - PosDebutFic))

-------------------
Nous n’avons plus qu’à traduire en texte grâce à la fonction ASCB et trouver ainsi le nom du fichier (NomFichier)

ContenuAscii = ""
for Z = 1 to LenB(NomFichier)
ContenuAscii = ContenuAscii & chr(ASCB(MidB(NomFichier, Z, 1)))
next
NomFichier = ContenuAscii

D / Recherche du contenu du fichier

-------------------
On cherche la position de début du contenu du fichier en sautant les blancs

PosFinCont = InstrB(PosDebutCont, Contenu, chrB(13))
if PosFinCont <> 0 then
PosDebutFic2 = PosFinCont + 4
end if

-------------------
On recherche la position de fin du contenu du fichier

LimitASCII = "----"
LimitBin=""
for Z = 1 to Len(LimitASCII)
LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, Z, 1)))
next

PosFinFic2 = InstrB(PosDebutFic2, Contenu, LimitBin)

-------------------
Si la position de fin du contenu du fichier n’est pas 0 alors tout est OK

if PosFinFic2 <> 0 then
ToutOk = 1
end if

-------------------
On place le contenu binaire du fichier transmis dans la variable DataFichier

DataFichier = MidB(Contenu, PosDebutFic2 , (PosFinFic2 - PosDebutFic2))

E/ Ecriture des données sur le serveur

-------------------
Si tout est ok, on écrit dans un fichier à la racine du serveur en plaçant d’abord dans une variable NouveauFic le chemin complet du fichier à écrire.

If ToutOk = 1 then
Position = InstrRev(NomFichier, "\")
NomFichierCourt = right(NomFichier, (Len(NomFichier) - Position))
NouveauFic = Server.MapPath("\") & "\" & NomFichierCourt
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set Out=FileObject.CreateTextFile(NouveauFic, True)
For I = 1 to LenB(DataFichier)
Out.Write chr(AscB(MidB(DataFichier,I,1)))
Next
Out.close
Set Out=nothing
end if
-------------------



Proregna - L'hébergement ASP.NET


A RETENIR CETTE SEMAINE
16/05/2008 - Logiciels Microsoft gratuits pour les étudiants
Vous êtes étudiant ? N’attendez pas pour télécharger* gratuitement et utiliser les derniers logiciel ...
16/05/2008 - Lillois, ne manquez pas les Wygdays 2008
Le 22 mai prochain à Lille, vous êtes invité à un événement unique dédié aux développeurs, organisé ...
16/05/2008 - Flash 10 est dans les bacs, Silverlight prend du retard
On est peut-être à un tournant très important de la bataille que se livrent Microsoft et Adobe sur l ...
15/05/2008 - Comment manipuler simplement le contenu d'un fichier WordML ?
Le format WordML (et plus largement OpenXML ) est une grande avancée: il permet de manipuler les doc ...
15/05/2008 - Package d'installation réseau de Windows XP Service Pack 3 pour les informaticiens
Ce package d'installation est destiné à permettre aux informaticiens et aux développeurs de configur ...
15/05/2008 - Mono supporte désormais Windows Forms et Silverlight
Jour de gloire pour le projet Mono. Miguel de Icaza annonce tout d'abord sur son blog la première re ...
14/05/2008 - Deux Services Packs en bêta pour Visual Studio
Microsoft annonce deux Services Packs en version bêta pour Visual Studio 2008 et pour le framework . ...
(c) 1999-2006 ASP MAGAZINE SARL
Partenaires : Codes sources c2i ASP-PHP
Hébergement serveurs dédiés Windows


Hit-Parade