Uploader un fichier sans composant ! {nouvelle methode}

Soyez le premier à donner votre avis sur cette source.

Vue 41 549 fois - Téléchargée 33 767 fois


Description

Et oui, c'est possible !
Bon, pour éviter tout mal entendu, j'ai enlevé la méthode précédente car j'utilisais une fonction qui provenait semble-t-il de ASPToday.
Stéphane Dorlac (Webmaster de Gasp) travaillant chez Wrox m'a demandé de retirer la source et pour éviter tout malentendu, je l'ai retirée et remplacée par une source que j'ai développé et qui n'a rien à voir avec la précédente)
Voici une méthode made by Nix De A à Z !
Je l'ai faite sous forme d'une Class car c'est plus simple à utiliser comme ça.
Il a quelques options, j'ai essayé de commenter un maximum.
Essayez le, vous verrez, c'est pas sorcié à utiliser
Je pense rajouter des options, si vous avez de bonnes idées, je suis preneur :)

(UNE NOUVELLE VERSION PERMETANT DE RECUPERER DES CHAMPS TEXTE EN MEME TEMPS EST DISPO ICI http://www.aspfr.com/code.aspx?ID=8673 )

Source / Exemple :


<!----------- Fichier uploadfichier.asp --------->
<!--#include file="clsUplFich.asp"-->
<%
' *****************************************************************************
' Réalisé par Nicolas SOREL ( Nix pour les intimes :) )
' Pour le site ASPFr.com
' Retrouvez d'autres scripts ASP sur www.ASPFr.com
' Vous avez le droit d'utiliser ce script dans vos pages mais si vous souhaitez
' l'exposer sur un autre site de programmation merci de me contacter
' (nix@codes-sources.com)
' *****************************************************************************
%>
<html>
<head>
    <title>Envoyer des fichiers</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#0000FF" alink="#FF0000">
<font face="Verdana" size="2" color="#000000">
<%
	Select Case Request.Querystring("Etape")
		Case ""
%>
<div align="center">
<form action="uploadfichier.asp?Etape=1" method="post" enctype="multipart/form-data">
    <br><br>
    Sélectionnez le(s) fichier(s) que vous souhaitez uploader.<br><br>
    <input type="file" name="Fichier1" accept="image/jpeg"><br>
    <input type="file" name="Fichier2" accept="image/jpeg"><br>
    <input type="file" name="Fichier3" accept="image/jpeg"><br>
    <input type="submit" value="Envoyer !">
</form>

</div>
<%
		Case "1"
			Dim MonUpload
			Dim i

			Set MonUpload = New UplFichier

			' .NbFichiers Retourne le nombre de fichiers Uploadé
			For i = 1 To MonUpload.NbFichiers
				Response.Write "<b>Fichier N° " & i & "</b><br>"
				' NomFichier(ID) Retourne le nom du fichier uploadé
				Response.Write "Nom du fichier : <b>" & MonUpload.NomFichier(i) & "</b><br>"
				' TailleFichier(ID) Retourne la taille du fichier uploadé
				Response.Write "Taille : <b>" & MonUpload.TailleFichier(i) & "</b> octets<br>"
				' ExtensionFichier(ID) Retourne l'extension du fichier uploadé
				Response.Write "Extension : <b>" & MonUpload.ExtensionFichier(i) & "</b><br>"
				' TypeFichier(ID) Retourne le type mime du fichier uploadé
				Response.Write "Type mime : <b>" & MonUpload.TypeFichier(i) & "</b><br>"
				' NomForm(ID) Retourne le nom du champ dans lequel était le fichier uploadé
				Response.Write "Nom de l'Input : <b>" & MonUpload.NomForm(i) & "</b><br>"
				' CheminFichierDistant(ID) Retourne le chemin distant sur lequel le fichier uploadé se trouvait
				Response.Write "Chemin distant : <b>" & MonUpload.CheminFichierDistant(i) & "</b><br><br>"

				' .NouveauNom Optionnel , si vous souahitez forcer le nom du fichier en local
				' Par défaut, le nom du fichier Uploadé sera utilisé
				' Exemple :
				' MonUpload.NouveauNom = "NouveauNomDuFichier.txt"

				' SauveFichier(ID) sauvegarde le fichier Uploadé
				MonUpload.SauveFichier(i)

				' ID représente le N° du fichier uploadé.
				' Si vous n'avez qu'un champ pour uploader, alors le ID sera 1
				' Dans cet Exemple, il y a plusieurs fichiers uploadé donc, je l'ai 
				' mis dans une boucle pour vous montrer comment faire
			Next
			Set MonUpload = Nothing
	End Select
	%>	
</font>
</body>
</html>
<!----------- Fin Fichier uploadfichier.asp --------->

<!----------- Fichier clsUplFich.asp --------->
<%
Option Explicit

' *****************************************************************************
' Cette Class a été réalisé par Nicolas SOREL ( Nix pour les intimes :) )
' Pour le site ASPFr.com
' Retrouvez d'autres scripts ASP sur www.ASPFr.com
' Vous avez le droit d'utiliser ce script dans vos pages mais si vous souhaitez
' l'exposer sur un autre site de programmation merci de me contacter
' (nix@codes-sources.com)
' *****************************************************************************
Class UplFichier

	Private ToutEnvoi

	Private VarFichierBin
	Private VarTailleFichier
	Private VarTailleBinFichier
	
	Private NomDesFichier()
	Private TailleDesFichier()
	Private NbDeFichiers
	Private LesFichiers()
	Private NomDesForm()
	Private CheminLocal
	Private CheminDistant()
	Private LocalNomFichier
	
	Private Property Let AjoutNomFichier(LeNom)
		Redim Preserve NomDesFichier(Ubound(NomDesFichier) + 1)
		NomDesFichier(Ubound(NomDesFichier)) = LeNom
	End Property

	Private Property Let AjoutTailleFichier(LaTaille)
		Redim Preserve TailleDesFichier(Ubound(TailleDesFichier) + 1)
		TailleDesFichier(Ubound(TailleDesFichier)) = LaTaille
	End Property

	Private Property Let AjoutCheminDistant(LeCheminDistant)
		Redim Preserve CheminDistant(Ubound(CheminDistant) + 1)
		CheminDistant(Ubound(CheminDistant)) = LeCheminDistant
	End Property

	Private Property Let AjoutFichier(LeFichier)
		Redim Preserve LesFichiers(Ubound(LesFichiers) + 1)
		LesFichiers(Ubound(LesFichiers)) = LeFichier
	End Property

	Private Property Let AjoutNomForm(LeNomForm)
		Redim Preserve NomDesForm(Ubound(NomDesForm) + 1)
		NomDesForm(Ubound(NomDesForm)) = LeNomForm
	End Property

	Public Property Let Dossier(LeDossier)
		CheminLocal = LeDossier
	End Property

	Public Property Let NouveauNom(NouvNomFichier)
		LocalNomFichier = NouvNomFichier
	End Property

	Public Function SauveFichier(Lequel)
		On Error Resume Next
		Dim fso, fs
		If LocalNomFichier = "" Then
			LocalNomFichier = NomDesFichier(Lequel)
		End If
		Set fso = CreateObject("Scripting.FileSystemObject")
		Set fs = fso.OpenTextFile(CheminLocal & LocalNomFichier, 2, True)
			If Err.Number <> 0 Then Response.Write "Erreur lors de l'écriture du fichier : " & CheminLocal & NomDesFichier(Lequel) & vbCrLf & Err.Description & "<br>":LocalNomFichier = "":Exit Function
			fs.Write LesFichiers(LeQuel)
			If Err.Number <> 0 Then Response.Write "Erreur lors de l'écriture du fichier : " & CheminLocal & NomDesFichier(Lequel) & vbCrLf & Err.Description & "<br>":LocalNomFichier = "":Exit Function
		Set fs = Nothing
		Set fso = Nothing
		LocalNomFichier = ""
	End Function

	Public Property Get NomFichier(Lequel)
		NomFichier = NomDesFichier(Lequel)
	End Property

	Public Property Get CheminFichierDistant(Lequel)
		CheminFichierDistant = CheminDistant(Lequel)
	End Property

	Public Property Get TailleFichier(Lequel)
		TailleFichier = TailleDesFichier(Lequel)
	End Property

	Public Property Get NomForm(Lequel)
		NomForm = NomDesForm(Lequel)
	End Property

	Public Property Get NbFichiers()
		NbFichiers = NbDeFichiers
	End Property

	Private Property Get HttpContentType()
		HttpContentType = Request.ServerVariables ("HTTP_CONTENT_TYPE")
	End Property

	Public Property Get TypeFichier(Lequel)
		TypeFichier = TypeDeFichier(NomDesFichier(Lequel))
	End Property

	Public Property Get ExtensionFichier(Lequel)
		ExtensionFichier = Right(NomDesFichier(Lequel), Len(NomDesFichier(Lequel)) - InStrRev(NomDesFichier(Lequel),"."))
	End Property

	Private Function Preliminaires()
		VarFichierBin = Request.BinaryRead(Request.TotalBytes)
		VarTailleBinFichier = LenB(VarFichierBin)
	End Function

	Private Sub Class_Initialize()
		ReDim NomDesFichier(0)
		ReDim LesFichiers(0)
		ReDim TailleDesFichier(0)
		Redim NomDesForm(0)
		ReDim CheminDistant(0)
		CheminLocal = Server.MapPath(".\") & "\" ' Dossier d'upload par defaut
		LocalNomFichier = "" ' Nom du fichier si l'on souhaite forcer un autre nom que le fichier envoyé
		Call Preliminaires
		Call LetsGOOOO
	End Sub

	Private Sub Class_Terminate()
		Set NomDesFichier = Nothing
		Set LesFichiers = Nothing
		Set TailleDesFichier = Nothing
	End Sub

	Private Function Upl2ADO()
		On Error Resume Next
		Upl2ADO = False
		Dim MonObjRs
		Set MonObjRs = CreateObject("ADODB.Recordset")
			MonObjRs.Fields.Append "TmpBin", 201, VarTailleBinFichier
			MonObjRs.Open
			MonObjRs.AddNew
			MonObjRs("TmpBin").AppendChunk VarFichierBin
			MonObjRs.Update
			ToutEnvoi = MonObjRs("TmpBin")
			MonObjRs.Close
		Set MonObjRs = Nothing
		If Err.Number <> 0 Then Response.Write "Erreur lors de l'upload du/des fichier(s) : " & vbCrLf & Err.Description & "<br>" : Exit Function
		Upl2ADO = True
	End Function

	Public Function LetsGOOOO()
		Dim LesLimites, LimitePosition
		Dim CompteFichier
		Dim DernierFichierDebut, DernierFichierFin, FichierEnCours
		Dim DebutNomFichier, FinNomFichier, NomDuFichier, DernierFichier
		Dim DebutFichier, FinFichier, DonneesDuFichier
		Dim LeContentType, TailleDuFichier, NomInput

		If Not VarTailleBinFichier > 0 Then
			Response.Write "Aucun fichier n'a été sélectionné"
			Exit Function
		End If

		If Upl2ADO = True Then
			' On Récupère l'entête HTTP
			LesLimites = HttpContentType

			' On met notre compteur de Fichier à 0
			CompteFichier = 0

			' On cherche les limites (les Boundaries)
		    LimitePosition = InStr(1, LesLimites, "boundary=") + 8
		    LesLimites = "--" & Right(LesLimites, Len(LesLimites) - LimitePosition)

			' ********************************************
			' ** Les choses sérieuses commencent ici :) **
			' ********************************************

			' On cherche le 1er fichier
			DernierFichierDebut = InStr(1, ToutEnvoi, LesLimites)
		    DernierFichierFin = InStr(InStr(1, ToutEnvoi ,LesLimites) + 1 , ToutEnvoi , LesLimites) - 1
			DernierFichier = False

			Do While DernierFichier = False
				FichierEnCours = Mid(ToutEnvoi, DernierFichierDebut, DernierFichierFin - DernierFichierDebut)
		    	DebutNomFichier = InStr(1, FichierEnCours, "filename=") + 10
		    	FinNomFichier = InStr(DebutNomFichier, FichierEnCours, Chr(34))
				
				' On vérifie que le champ du fichier n'est pas vide
		    	If DebutNomFichier <> FinNomFichier Then
					CompteFichier = CompteFichier + 1
					' On récupère le(s) nom(s) du/des champ(s) Input du formulaire
		    		NomInput = InStr(1, FichierEnCours, "name=""")
		    		If NomInput > 0 Then
		    			NomInput = Mid(FichierEnCours, NomInput + 6, InStr(NomInput + 6, FichierEnCours, """") - NomInput - 6)
		    		End If
					AjoutNomForm = NomInput
					'Response.Write NomInput & "<br>"
					
					' On récupère le chemin du fichier (distant) puis on extrait juste le non du fichier
		    		NomDuFichier = InStr(1, FichierEnCours, "filename=""")
		    		If NomDuFichier > 0 Then
		    			NomDuFichier = Mid(FichierEnCours, NomDuFichier + 10, InStr(NomDuFichier + 10, FichierEnCours, """") - NomDuFichier - 10)
		    		End If
					'Response.Write NomDuFichier
					
					AjoutCheminDistant = NomDuFichier
					NomDuFichier = Right(NomDuFichier, Len(NomDuFichier) - InStrRev(NomDuFichier,"\"))

					' On repère le début du fichier qui se trouve après le Content-Tpye
		    		LeContentType = InStr(1, FichierEnCours, "Content-Type:")
		    		If LeContentType > 0 Then
		    			DebutFichier = InStr(LeContentType, FichierEnCours, vbCrLf) + 4
		    		End If
		    		FinFichier = Len(FichierEnCours)

				    ' Calcul de la taille du fichier
		    		TailleDuFichier = FinFichier - DebutFichier

				    ' Recup. du fichier
		    		DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

					AjoutFichier = DonneesDuFichier
					AjoutNomFichier = NomDuFichier
					AjoutTailleFichier = Len(DonneesDuFichier) 'LaTaille
				End If
				' On va au fichier suivant
				' On repère le début et la fin du fichier suivant
			    DernierFichierDebut = InStr(DernierFichierFin + 1, ToutEnvoi, LesLimites)
			    DernierFichierFin = InStr(DernierFichierDebut + 1 , ToutEnvoi, LesLimites) - 1
				If Not DernierFichierFin > 0 Then DernierFichier = True
			Loop
			NbDeFichiers = CompteFichier
			' ************************
			' ** La Fin du bazar :) **
			' ************************

		Else
			Response.Write "Il y a eu une erreur lors de l'upload"
		End If

	End Function

	Private Function TypeDeFichier(LeFichier)
		Dim TmpExt
			TmpExt = Right(LeFichier, Len(LeFichier) - InStrRev(LeFichier,"."))
        Select Case LCase(TmpExt)
            Case "jpg", "jpeg"
                TypeDeFichier = "image/jpeg"
            Case "gif"
                TypeDeFichier = "image/gif"
            Case "png"
                TypeDeFichier = "image/png"

            Case "txt"
                TypeDeFichier = "text/plain"
            Case "asp"
                TypeDeFichier = "text/asp"
            Case "html", "htm"
                TypeDeFichier = "text/html"
            Case "xml"
                TypeDeFichier = "text/xml"

            Case "doc"
                TypeDeFichier = "application/msword"
            Case "doc"
                TypeDeFichier = "application/vnd.ms-excel"
            Case "pdf"
                TypeDeFichier = "application/pdf"

            Case "exe"
                TypeDeFichier = "application/x-msdownload"
            Case "zip"
                TypeDeFichier = "application/x-compressed"
            Case "rar"
                TypeDeFichier = "application/x-rar-compressed"

			Case "mp3", "mp2"
				TypeDeFichier = "audio/mpeg"
			Case "au"
				TypeDeFichier = "audio/basic"
			Case "wav"
				TypeDeFichier = "audio/x-wav"

			Case "mpg", "mpeg"
				TypeDeFichier = "video/mpeg"
			Case "avi"
				TypeDeFichier = "video/avi"
			' Liste non exhaustive, vous pouvez en rajouter autant que vous voulez

            Case Else
                TypeDeFichier = "application/unknown"
        End Select
	End Function

End Class
%>
<!----------- Fin Fichier clsUplFich.asp --------->

Conclusion :


P.S : Cette fois, je veux pas entendre parler que ce source serait déjà sur un autre site parce que :
1) C'est pas possible :)
2) J'ai passé la soirée et la nuit à le faire :(

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

aqkoukou
Messages postés
1
Date d'inscription
mardi 17 juin 2008
Statut
Membre
Dernière intervention
17 juin 2008
-
Bravo pour ce source.
Juste un problème de syntaxe qui me bloque

Dans MonUpload.NouveauNom = je souhaite récupérer un code d'une page précédente par code=request("cod")et composer un nouveau nom tel que
"\images" & code & "-" & MonUpload.NomFichier(i)
Cette syntaxe ne marche pas. J'en ai essayé un tas d'autres bien sûr.
Merci de votre aide précieuse.
Aqkoukou
pifou25
Messages postés
150
Date d'inscription
lundi 13 octobre 2003
Statut
Membre
Dernière intervention
21 décembre 2014
-
Bonjour,
J'ai résolu le pb (que certains ont eu ici aussi) ligne 128 type incompatible (type mismatch): remplacer la procedure ainsi:

Private Sub Class_Terminate()
ReDim NomDesFichier(0)
ReDim LesFichiers(0)
ReDim TailleDesFichier(0)
End Sub

Set NomDesFichier = Nothing : ça rime à rien vu que la variable n'est pas un objet, donc ça pete. En plus c'est à cause du option explicit, sinon je suis sur que ça passerait ^^

Par contre si on a l'erreur suivante, que faire?

Erreur de compilation Microsoft VBScript erreur '800a0400'
Instruction attendue
Option Explicit
^
kevtuning
Messages postés
10
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
15 juillet 2004
-
C'est un problème de IIS 6.0

tu trouveras la solution ici... http://support.softartisans.com/kbview_900.aspx
DOLLEL
Messages postés
15
Date d'inscription
mardi 6 janvier 2004
Statut
Membre
Dernière intervention
14 avril 2011
-
Rebonjour,

J'ai oublié de dire quelle commande provoque le message d'erreur "Operation not allowed", c'est "Request.Binaryread".

Merci.

Laurent
DOLLEL
Messages postés
15
Date d'inscription
mardi 6 janvier 2004
Statut
Membre
Dernière intervention
14 avril 2011
-
Bonjour,

Ton code est un top depuis plusieurs années. Je l'utilise depuis pas mal de temps, mais depuis que j'ai transféré une appli de Win 2000 Server vers Win 2003, l'upload d'un gros fichier (>1Mo) provoque le message d'erreur: "Operation not allowed". Je cherche pourquoi depuis un certain temps. Peux-tu m'aider sur ce coup?

Merci d'avance.

Laurent

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.