1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| <!--
Nous pouvons facilement uploader nimporte quel type de fichier sur un serveur sans avoir besoin dun quelconque composant.
Le concept est simple et se résume à trois phases :
1- Nous utilisons pour passer les données le contrôle Filename et l'enctype à multipart/form-data
2- Nous récupérons les données du fichier sous forme binaire grâce au Content-Type.
3- Nous écrivons sur le serveur les données sous le nom original du fichier.
Pour de plus ample explication voir la description à la page http://www.nc-technologies.com/fr/Article2.asp?CLE=73
-->
<%
' --------------------------------------------------------------
' NC-Upload V1 / UPLOAD de n'importe quel type de fichier sans composant
' Nicolas Chu
' http://www.nc-technologies.com
' (c) 1999
' --------------------------------------------------------------
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
' -------------
' 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
' -------------------
' 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
' -------------------
' On en 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
' -------------------
' 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))
' -------------------
' 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
%> |
Partager