Récupération des champs d'un formulaire lors d'un upload sans composant

Contenu du snippet

Cette source sert a résoudre le pb que j'ai rencontré lors d'un upload sans composant.
En effet, les différentes sources du net passent toutes par Request.BinaryRead ce qui empeche ensuite de faire Request.Form et c'est tres génant si le formulaire ne servait pas qu'a upload et contenait des champs textes.

La fonction permet donc de retrouver la valeur d'un champ texte au milieu des données obtenu par BinaryRead et donc de pouvoir faire l'upload tout en retrouvant les infos du formulaire.

Certains vont peut etre trouver ca bourrin mais bon je ne pouvais pas passez par un composant et je ne voulais pas faire l'upload dans un formulaire à part. Et puis j'ai vu que d'autre avaient eu le meme pb mais que personne n'y avait proposé de solution (ou sinon j'ai pas trouvé).

Pour ce qui est du code en lui meme, vous m'excuserez, j'avais jamais toucher à l'asp et au formulaire avant avant-hier...

Source / Exemple :


'on récupere le contenu du formulaire en binaire 
Contenu = Request.BinaryRead(Request.TotalBytes)

'************************************************************************
'LE FORMULAIRE SUIVANT :
'<FORM METHOD="Post" ENCTYPE="multipart/form-data" ACTION="upload.asp">
'<INPUT TYPE="submit" NAME="Enter" Value="UPLOAD">
'<INPUT TYPE="file" NAME="FileTO" size="50">
'</FORM>
'************************************************************************
'RETOURNE PAR BINARYREAD :
'-----------------------------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 
'bla bla bla Contenu de Test.text bla bla bla
'-----------------------------7d037a33e8&#8212;
'************************************************************************

'fonction retournant la valeur dun champ texte 
'recu d'un formulaire lu par BinaryRead
public function getValue(Contenu,var)
PosDebutValue=0 
getValue=""
'marqueur de debut
LimitASCII = "name=" & chr(34) & var & chr(34) 
LimitBin=""
for i = 1 to Len(LimitASCII)
	LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, i, 1)))
next
'position marqueyr de debut
PosDebutValue = InstrB(1, Contenu, LimitBin)
'si on trouve le marqueur
if PosDebutValue <> 0 then
	'position debut de la valeur
	PosDebutValue = PosDebutValue + LenB(LimitBin)
	'marqueur de fin
	LimitASCII = "-----" 
	LimitBin=""
	For i = 1 to Len(LimitASCII)
		LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, i, 1)))
	next
	'position marqueur de fin
	PosFinValue = InstrB(PosDebutValue, Contenu, LimitBin)
	'position fin de la valeur
	PosFinValue = PosFinValue - 2
	'recuperation valeur
	valBin = MidB(Contenu, PosDebutValue , (PosFinValue - PosDebutValue)) 
	getValue = ""
	for i = 1 to LenB(valBin)
		getValue=getValue & chr(ASCB(MidB(valBin, i, 1)))
	next
	getValue=Right(getValue,Len(getValue)-4)
end if
end function

'fonction qui permet d'uploader
'source : http://www.asp-magazine.com/fr/asp/blitz/blitz10.asp
'Contenu : Contenu du post du formulaire en binaire
'Retourne le nom du fichier uploader
function upload(Contenu)
'recuperation de la taille
TailleContenu = Request.TotalBytes
PosDebutFic=0 
upload=""
'marqueur pour recuperer le nom du fichier
LimitASCII = "filename=" & chr(34) 
'conversion en binaire
LimitBin=""
for i = 1 to Len(LimitASCII)
	LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, i, 1)))
next
'recuperation de la position du marqueur
PosDebutFic = InstrB(1, Contenu, LimitBin)
'si le marqueur est présent (sinon pas de fichier a uploader)
if PosDebutFic <> 0 then
	'debut du nom de fichier
	PosDebutFic = PosDebutFic + LenB(LimitBin)
	'marqueur de fin de nom
	LimitASCII = "Content-Type:" 
	'conversion en binaire
	LimitBin=""
	For i = 1 to Len(LimitASCII)
		LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, i, 1)))
	next
	'position de fin du nom
	PosDebutCont = InstrB(1, Contenu, LimitBin)
	PosFinFic = PosDebutCont - 3
	'nom du fichier en binaire
	NomFichierBin = MidB(Contenu, PosDebutFic , (PosFinFic - PosDebutFic)) 
	'conversion en ASCII
	NomFichierAscii = ""
	for i = 1 to LenB(NomFichierBin)
		NomFichierAscii = NomFichierAscii & chr(ASCB(MidB(NomFichierBin, i, 1)))
	next
	'si c'est bien un jpg
	if (Right(NomFichierAscii,4)=".jpg" or Right(NomFichierAscii,4)=".JPG") then
		'position de debut des datas
		PosDebutCont = PosDebutCont + LenB(LimitBin)
		PosFinCont = InstrB(PosDebutCont, Contenu, chrB(13))
		PosDebutData = PosFinCont + 4 
		'marqueur de fin des datas
		LimitASCII= "----"
		'conversion en binaire
		LimitBin=""
		for i = 1 to Len(LimitASCII)
			LimitBin = LimitBin & chrB(ASC(Mid(LimitASCII, i, 1)))
		next
		'position de fin de data
		PosFinData= InstrB(PosDebutData, Contenu, LimitBin) -2
		'recuperation des datas
		DataFichier = MidB(Contenu, PosDebutData , (PosFinData - PosDebutData)) 
		'recuperation du nom de fichier 
		upload = right(NomFichierAscii, (Len(NomFichierAscii) - InstrRev(NomFichierAscii, "\"))) 
		'creation du fichier sur le serveur
		Set FSO = Server.CreateObject("Scripting.FileSystemObject")
		Set Out=FSO.CreateTextFile( Server.MapPath("\Temp") & "\" & upload , True)
		'copie des datas
		For i = 1 to LenB(DataFichier)
			Out.Write chr(AscB(MidB(DataFichier,i,1)))
		Next
		'fermeture du fichier
		Out.close
		Set Out=nothing
	end if
end if
end function

Conclusion :


Voila :o)
J'ai pas encore tout tester mais ca marche pour ce que je veux en faire...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.