UPLOADER UN FICHIER SANS COMPOSANT V2.0

sebastienrama - 4 sept. 2001 à 20:11
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005 - 14 nov. 2007 à 13:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/8673-uploader-un-fichier-sans-composant-v2-0

cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
14 nov. 2007 à 13:38
AppendChunk ne fonctionne que sur les champs de type ntext ou image (taper AppendChunk dans Google).
Je n'ai par contre pas réussi à restituer le fichier uploadé après avec le code de Nix.
J'ai donc utilisé une autre solution similaire à celle-ci, sauf que le cas de la restitution a été envisagé et fonctionne (je l'ai fait fonctionner) : http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=7361&lngWId=4
Quelques remarques sur cette solution :
* Il faut modifier la méthode FileName dans clsField car des navigateurs comme Firefox ne retournent pas le chemin du fichier
* Je n'ai pas testé pour les listes à choix multiples
a17249 Messages postés 5 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 27 mars 2008
11 oct. 2007 à 15:54
Je me suis créé une petite fonction qui fait ceci :
Public Function Upl2ADONew( NomDuFichier , TailleDuFichier)
'On Error Resume Next
Upl2ADONew = False
Dim MonObjRs
Set MonObjRs = CreateObject("ADODB.Recordset")
Isql ="Select * from upload"
MonObjRs.Open Isql, conn, adOpenKeyset, adLockPessimistic

MonObjRs.AddNew

MonObjRs("Data").AppendChunk VarFichierBin

' MonObjRs("DataBin").AppendChunk VarFichierBin

MonObjRs("SouceFileName") = CheminLocal & NomDuFichier
MonObjRs("Taille") = TailleDuFichier

MonObjRs("UploadDT") = Now()
MonObjRs.Update


MonObjRs.Close
Set MonObjRs = Nothing

If Err.Number <> 0 Then
Response.Write "Erreur lors de la sauvegarde du fichier en base du/des fichier(s) :
" & vbCrLf & Err.Description & "
"
Exit Function
End If
Upl2ADONew = True
End Function

Mais ça marche uniquement si c'est un champ destination de type image; or, je voulais le stocker dans un champ de type varbinary.
Pourquoi n'est-ce pas possible ?
Si j'essaie d'écrire dans un champ varbinary, j'obtiens l'erreur :

ADODB.Field error '800a0c93'

L'opération demandée n'est pas autorisée dans ce contexte.

What is the problem ??!!
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
11 oct. 2007 à 15:35
A17249 > Il suffit de stocker le code binaire du fichier que tu obtiens avec ce script dans un champs de type binaire dans ta base...
a17249 Messages postés 5 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 27 mars 2008
11 oct. 2007 à 15:01
Le code est super et marche très bien chez moi mais je n'arrive pas à ajouter une fonction qui marche vraiment bien pour stocker le fichier dans une base de données en lieu et place de la sauvegarde sur disque. Quelqu'un pourrait-il m'aider ?? car apparemment, je ne suis pas la seule à avoir ce genre de préoccupation mais je ne trouve aucune réponse valable !
Merci d'avance.
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
21 nov. 2006 à 11:43
Code très bien pensé et super pratique. Une petite remarque par contre. Je l'ai utilisé dans un form où j'avais des selects à choix multiples. Or chaque ligne sélectionnée se voit éclatée en binaire (avec le même attribut name) et celà n'a pas été prévu (on ne récupérait que la dernière ligne sélectionnée...).
J'ai donc ajouté une fonction qui cumule si on trouve plusieurs fois le même nom :
Private Sub AjoutChamp(NomChamp, ValeurChamp)
dim trouve

trouve = false

For i = 1 To UBound(NomChampTXT)
If NomChampTXT(i) = NomChamp Then
trouve = true
Exit For
End If
Next

if trouve then
' pas besoin d'ajouter le nom du champ
LesChampTXT(i) = LesChampTXT(i) & ", " & ValeurChamp

else
' on ajoute le nom du champ et sa valeur

' nom du champ
Redim Preserve NomChampTXT(Ubound(NomChampTXT) + 1)
NomChampTXT(Ubound(NomChampTXT)) = NomChamp

' valeur du champ
Redim Preserve LesChampTXT(Ubound(LesChampTXT) + 1)
LesChampTXT(Ubound(LesChampTXT)) = ValeurChamp
end if
End Sub

Et il suffit de remplacer
AjoutChampNOM = NomInput
AjoutChampTXT = DonneesDuFichier
par
AjoutChamp NomInput, DonneesDuFichier
mamistitch Messages postés 3 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 22 août 2006
4 mai 2006 à 16:53
Merci pour ce code. Exactement ce dont j'avais besoin.
Mais quelle est la raison de l'utilisation de ADODB pour farfouiller dans les données ? Commodité ou nécessité ?
Evidemment, ce serait confortable de pouvoir choisir plusieurs fichiers en une seule fois. Je ne vois aucune différence entre la fenêtre windows qu'ouvre ma messagerie pour choisir DES pièces jointes et celle qu'ouvre "input type=file" qui ne permet pas les choix multiples.
bouba_zyx Messages postés 2 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 9 décembre 2009
18 mars 2006 à 22:59
Pour le pb d'upload pour fichier de taille suppérieur à 200ko voilà un lien qui explique trés bien le pb et comment le corriger, c'est en anglais mais trés simple !

http://www.dmxzone.com/showDetail.asp?TypeId=7&NewsId=5424
chafry Messages postés 1 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 12 janvier 2006
12 janv. 2006 à 16:46
Bonjour,
merci pour ce code, ca marche parfaitement

mon pb, j'arrive pas à uploder des gros fichiers ( > 200ko, serveur WIN NT, II5)

je voudrais savoir comment on fait pour uploder des gros fichiers

merci d 'avance
aymron Messages postés 5 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 18 octobre 2005
25 juil. 2005 à 12:16
"J'ai dû enlever l'include de lui-même dans clsUpFich.asp, et l' Option explicit sur un 2003 server. A part ces deux détails auxquels je m'attendais à la lecture des posts précédents tout fonctionne parfaitement.
Merci Nix, je me voyais mal istaller un composant sur un serveur "sensible" et ces scripts m'enlèvent une fière chandelle du pied :) "

Ben moi, c'est exactement pareil !!!
Vraiment un gros gros merci !!!
_Thy_ Messages postés 33 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 19 septembre 2005
6 avril 2005 à 16:31
J'ai dû enlever l'include de lui-même dans clsUpFich.asp, et l' Option explicit sur un 2003 server. A part ces deux détails auxquels je m'attendais à la lecture des posts précédents tout fonctionne parfaitement.
Merci Nix, je me voyais mal istaller un composant sur un serveur "sensible" et ces scripts m'enlèvent une fière chandelle du pied :)
cs_Jackboy Messages postés 757 Date d'inscription vendredi 7 septembre 2001 Statut Membre Dernière intervention 19 juin 2008
5 août 2004 à 16:01
est t'il possible de faire un upload par batch (un fichier apres l'autre) avec ce composant ? ex.: download de toutes les images selon un liste
cs_rafikov Messages postés 1 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 26 janvier 2004
26 janv. 2004 à 03:33
salut Nix, Ton code est génial. Merci. il roule tres bien.

Sauf que j'ai un problème avec la fonction qui permet de récupérer des champs de type text, textaera, checkbox, radio, etc... en même temps que l'upload d'un fichier.

En effet, cette fonction n'a pas prévu le cas ou j'ai un groupe de checkbox dans mon formulaire et que je dois récuperer les valeurs des checkbox sélectionnés.

si qqu'un a une suggestion sur la question...

Merci d'avance.
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004
17 déc. 2003 à 14:14
Après quelques tests sur mon problème, j'ai trouvé la solution pour Djean & cellofan. Pour contrer le problème Mid ( voir message ci-dessus ), j'ai mis mon dans sa propre form
Ex :
Titre de la source,

----

,

----

Ajouter un fichier

<FORM name=\"Identification\" method=\"post\" action=\"gestsource.asp?Cat=2&Page=1&Etape=1\" enctype=\"multipart/form-data\">
----

,

----

,
,

</FORM>


Si on met d'autres champs dans la même form que le champ de type file alors ça plante avec Mid.
En espérant que ça aide
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004
17 déc. 2003 à 11:33
J'ai testé la source et elle marche bien lorsque je ne dispose que du mais lorsque je rajoute un champ dans la page alors j'ai le même problème que Djean & cellofan

c'est à dire :
Argument ou appel de procédure incorrect: 'Mid'
fichier:clsUplFich.asp à la ligne :DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

Si quelqu'un a su intégré un champ texte. qu'il me dis comment il a fait. Merci
jayzee Messages postés 3 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 12 juin 2003
12 juin 2003 à 17:24
Bon bah j'ai fait comme yOm a dit :

g ajouter un tableau NomDesFile()
ainsi kune propriete AjoutNomFile(LeNomFile)
et kune autre propriete NomFile(Lequel)

Ensuite dans la fonction LetsGOOOO, apres la ligne :
If EstFichier = True Then

j'ajoute le nom de l'input dans mon nouveau tableau :
AjoutNomFile = NomInput

et hop le tour est joué :)
jayzee Messages postés 3 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 12 juin 2003
12 juin 2003 à 17:01
ouep merci pour ce tres bon code !!

ca tourne nickel, bon moi aussi j'ai des petits soucis car mes input text sont positionnés avant les inputs file.
du coup je ne recupere jamais le bon nom de l'input et c po pratique pour le sauver en base.
mais bon c po grave, je vais essayer de trouver une parade.

en tous cas merci pour ce code
alouillet Messages postés 1 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 13 mai 2003
13 mai 2003 à 14:44
Comme tout le monde, exactement ce que je voulais.

2 petites choses :
- Faire un fs.close pour les puristes dans SauveFichier

- Ajouter un Dim I dans Property Get ChampForm(Lequel) car si on ne fait pas ça et qu'on appel cette méthode dans la boucle de uploadFichier.asp cela interagit avec la variable I de la boucle.

Merci nix pour le gain de temps énorme
xclear Messages postés 33 Date d'inscription dimanche 21 avril 2002 Statut Membre Dernière intervention 21 juin 2006
4 févr. 2003 à 00:01
ca marche super merci nix pour ce code juste une info serai t'il possible en plus de remplir un champs d'une base en même temps que le telechargement????
merci ecrivez a xclear@noos.fr
xclear vous remercie et vous salut
lutinpitchoune Messages postés 10 Date d'inscription jeudi 14 mars 2002 Statut Membre Dernière intervention 1 octobre 2002
1 oct. 2002 à 13:11
Salut niX,

Avant tout, meme si on te l'as déjà dit, ton code est super,
je l'ai un peu modifier pour réaliser des tests avant d'enregistrer définitivement le fichier sur le site.
En fait j'utilise ton code pour enregistré mes fichiers dans un repertoire temp/
et après si les tests sont bons je déplace les fichiers de temp/ à upload/.
Cette technique m'a permis de ne pratiquement pas changer ton code.

Chez moi tout marche super, j'ai eu des problemes avec l'OPTION EXPLICIT,
mais j'ai tout réglé en definissant bien toutes mes variables.
Donc sur mon ordi chez moi ça marche, par contre au bureau, ca plante.
le premier formulaire s'affiche, je rentre les données, j'envoie et là ça plante et j'ai l'erreur suivante :

Erreur d'exécution Microsoft VBScript erreur '800a01b6'
Cet objet ne gère pas cette propriété ou cette méthode: 'Request.TotalBytes'

/wwwcna-mocom/clsUplFich.asp, ligne 132

Et elle se répete deux fois.
La ligne 132 correspond à :
Private Sub Class_Initialize()
ReDim NomDesFichier(0)
ReDim LesFichiers(0)
ReDim TailleDesFichier(0)
Redim NomDesForm(0)
ReDim CheminDistant(0)
>>>>>>>>>> Redim LesChampTXT(0) <<<<<<<Cette ligne

Sur le serveur j'ai pas encore pu essayer
car il faut que mon hebergeur modifie les droits d'acces au repertoire ou j'ai ma base de données,
mais j'ai peur que le même probleme se pose, même de temps en temps.

Si tu vois de quoi ça peut venir, dis le moi.
D'avance merci
Lutin Pitchoune

Au fait :
Mon installation chez moi :
Windows 95
Internet explorer 5
PWS v4.0 (je crois)
Au boulot :
Windows NT 4 Workstation
Internet explorer 5
Internet Information Server 2.0 version 4.0
cs_cellofan Messages postés 1 Date d'inscription jeudi 26 octobre 2000 Statut Membre Dernière intervention 9 juillet 2002
9 juil. 2002 à 09:40
Salut Monsieur Nix et ts les autres. J'ai essayé ton script qu a tout d'abord très bien fonctionné, mais il me fait maintenant la même erreur qu'à "Djean", c'est à dire :
Argument ou appel de procédure incorrect: 'Mid'
fichier:clsUplFich.asp à la ligne :DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

Donc du coup, ca ne marche plus... Voilà, si qqu'un a une suggestion sur la question... Merci d'avance.
vinygrr Messages postés 4 Date d'inscription lundi 1 juillet 2002 Statut Membre Dernière intervention 7 mai 2004
1 juil. 2002 à 12:01
ca marche parfaitement(j'ai evidemment fais des petites adaptations pour mon confort perso!!!)...WOOOAWW...merci Nix!;-)
juste une remarque...si le fichier que l'on upload existe deja on ecrase le fichier existant...y a pas un moyen pour dans ce cas la renommer le fichier???
cs_konogan Messages postés 1 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 6 juin 2002
6 juin 2002 à 11:13
tout d'abord felicitaions pour ce sript tres pratique, tout fonctionne a merveille chez moi.

j'ai juste une petite question :

comment faire en sorte que le fichier uploadé le soit sur un autre serveur que celui qui execute la page ?
en l'occurence dans un repertoire ftp sur un serveur independant.
y0m Messages postés 1 Date d'inscription mercredi 5 juin 2002 Statut Membre Dernière intervention 5 juin 2002
5 juin 2002 à 11:39
Je regardais le code source de l'exemple hier et j'ai remarqué une "erreur" qui correspond à un des posts ci dessus

' NomForm(ID) Retourne le nom du champ dans lequel était le fichier uploadé
Response.Write "Nom de l'Input : " & MonUpload.NomForm(i) & "
"

Ce n'est vrai que dans le cas où les input de type file sont placés en tout premier dans le formulaire.
S'ils sont placés en fin, on obtient le nom d'un autre champ (tout dépend de l'organisation du formulaire).

Personnellement, je proposerais d'ajouter un tableau à la class "NomDesInputFiles()", ainsi que les méthodes associées à l'ajout et à la lecture.

Pour les habitués de aspSmartUpload, on voit que dans un cas comme celui de l'exemple fournit avec cette classe, 3 éléments de type "File" sont créés au sein de l'objet aspSmartUpload, et ce même si on n'a pas choisi de fichier pour l'un des 3 inputs.
Ici, la class ne crée d'élément "file" que si l'input contient quelque chose. Donc, si je rentre un fichier dans l'input "fichier2", la class crée un fichier et est accessible par :
MonUpload.NomFichier(1)

Enfiin, beau travail tout de même, ça mérite quelques améliorations mais c'est une class très pratique quand on sait que aspSmartUpload a tendance à "planté" à la création de l'objet alors que l'installation, les droits, l'accès à la DLL sont corrects.
cs_Rackham Messages postés 1 Date d'inscription lundi 23 octobre 2000 Statut Membre Dernière intervention 4 juin 2002
4 juin 2002 à 10:49
Je me trompe peut-être mais est-ce normal que tu inclue un fichier dans lui-même ?

<!----------- Fichier clsUplFich.asp --------->
<!--#include file="clsUplFich.asp"-->
<%
Option Explicit

De plus chez moi, l'Option Explicit me renvoie une erreur :

Type d'erreur :
Erreur de compilation Microsoft VBScript (0x800A0400)
Instruction attendue
/test/clsUplFich.asp, line 4
Option Explicit

Sinon, merci bien pour ce code, ca marche nickel...
theryu Messages postés 1 Date d'inscription lundi 29 avril 2002 Statut Membre Dernière intervention 29 avril 2002
29 avril 2002 à 17:58
Bonjour,

Félicitation pour ce code génial, cependant, il contient un petit hic : le nom des input files renvoyés ne correspond pas toujours à ceux des fichiers liés.

Explication :
- si je laisse la page d'exemple tel quel, et que j'envoie trois fichiers, tout ce déroule normalement : le nom de l'input de mon premier fichier s'appelle bien fichier1, celui de mon deuxième fichier2, etc.
- si en revanche je n'envoie que deux fichiers dans les input 'fichier2' et 'fichier3', j'obtiens que le nom de l'input du premier fichier est 'fichier1' (au lieu de 'fichier2')et celui du deuxième 'fichier2' (au lieu de 'fichier3')

En fait, le nom de l'input qui est renvoyé est le nom de l'input correspondant à l'indice du fichier (si on traite le premier fichier c'est le nom du premier input du formulaire qui sera renvoyé, même si ce n'est pas un input file!)

Voilà, voilà... quelqu'un aurait-il une solution SVP ?
MarxKarl Messages postés 4 Date d'inscription jeudi 18 avril 2002 Statut Membre Dernière intervention 18 avril 2002
22 avril 2002 à 15:22
PS : j'ai installer M$ script et ca ne vien pas de la.
(WARNING : M$ script est necessaire pour realiser des classes avec NT4 + SP6 + IIS)

j'ai reelement besoin d'aide.
MarxKarl Messages postés 4 Date d'inscription jeudi 18 avril 2002 Statut Membre Dernière intervention 18 avril 2002
22 avril 2002 à 15:19
j'ai essaye ce script et il est tout bonnement fabuleux. seul PB, sur ma station NT4 + SP6 + IIS ca marche nickel mais sur mon server NT4 + SP4 + IIS ca ne marche pas !!!
j'en devien fou ... qu'ai je oublier d'installer (je ne peut pas rebooter le server il est en cour de fonctionnement)

merci de votre aide.
cs_JaySee Messages postés 10 Date d'inscription jeudi 11 avril 2002 Statut Membre Dernière intervention 18 janvier 2005
12 avril 2002 à 12:52
Ton script est super bien foutu et surtout surper facile a comprendre mais g un chti bleme...

Lorsque j'essai ta page d'exemple car marche nickel et g bien mon fichier d'ecrit sur le serveur, mais si je passe par un formulaire a moi un peu plus complet je me retrouve avec:

Erreur d'exécution Microsoft VBScript (0x800A0009)
Indice en dehors de la plage: 'Lequel'
/FR/Perso/clsUplFich.asp, line 112

(correspond a l:
L111: Public Property Get TailleFichier(Lequel)
L112: TailleFichier = TailleDesFichier(Lequel)
L113: End Property

sinon desfois g aussi:
Argument ou appel de procédure incorrect: 'Mid'
fichier:clsUplFich.asp à la ligne :DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

strange car avec ton formulaire ca pase nickel...

T'en pense koi?

Merci
netjl Messages postés 2 Date d'inscription vendredi 1 février 2002 Statut Membre Dernière intervention 1 février 2002
1 févr. 2002 à 10:01
Salut Nix je tente de laisser un message ici aussi, car c'est cette version que j'utilise, j'ai mis ton script sur un serveur de site internet distant, et j'ai le message suivant :

Fichier N° 1
Nom du fichier : essai.txt
Taille : 65 octets
Extension : txt
Type mime : text/plain
Nom de l'Input : Fichier1
Chemin distant : C:Mes documentsessai.txt

Erreur lors de l'écriture du fichier : D:Inetpubwwwrootenlimousindossieressai.txt Permission refusée
TEXTE : essai texte
TEXTAERA : essai text area

Comment faire pour que ton pgm prenne mon chemin de serveur en compte et non D:inetpub ...etc.

Merci
cs_sdh Messages postés 4 Date d'inscription lundi 21 janvier 2002 Statut Membre Dernière intervention 24 septembre 2003
21 janv. 2002 à 12:00
Ton code est super bien fichu. Code clair, indetation impécable, RAD.
Si j'ai trouvé une erreur de copier / coller, dans la fin de ton code dans la fonction "type de fichier", le type d'extention d'un fichier excel est xls, mais tout le monde aura rectifier de lui même

Merci pour pour code et pour ton site
Sickfrid Messages postés 1 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 8 janvier 2002
8 janv. 2002 à 14:33
ce code est vraiment excellent mais une ptite question quand meme ! Peut-on avoir le nom de l'input file ? parceque mes input file sont éparpillés dans un formulaire au milieu de plusieurs autres input...

Merci ! ! ! ! !

PS : ssvp c'est assez urgent...
c'est absolument génial...

sauf que je vien de tomber sur un os.
j'ai besoin d'Uploader des documents sans que ces derniers ne soit designer
par un input Files
est ce possible ????
Voilà, j'ai un big problème:
Comment uploader ma base de donnée chmps ID NOMS EMAIL
Faut-il faire des changements
et lesquels avant d'utiliser ton code?
Je suis novice dans le domaine et les explications sont un peu trop hermétiques
Merci d'avance
Marie-Line
Salut Nix

Super ton code mais j'ai un petit problème.

Il me génère une erreur :
Argument ou appel de procédure incorrect: 'Mid'
fichier:clsUplFich.asp à la ligne :DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

Ton avis SVP

A+
djean
sebastienrama
4 sept. 2001 à 20:11
Ton code est super nix...
Cependant j'ai une base de donnée avec les champs


id I image I descript

Comment faire pour que les noms des fichier s'y introduisent ?
Rejoignez-nous