Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1433 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [CGI - C] Upload de fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[CGI - C] Upload de fichier

n°771495
Worldofdad​a
Posté le 21-06-2004 à 15:42:54  profilanswer
 

Salut !
 
Je suis un peu embetté car, étant en stage, je dois réaliser un module Intranet en CGI (codé en C). (e qui fait que je tappe toutes mes pages HTML avec du fprintf(stdout, "<html>" ) ....
 
Bref, j'ai un petit souci sur lequel je n'arrive pas a trouver ma réponse.
Les utilisateurs doivent pouvoir télécharger des pieces jointes.
J'ai déjà fait ca en ASP ainsi qu'en PHP sans gros pbs (a part un peu pour l'ASP mais bon).
Le truc, c'est que je ne sais pas comment faire pour télécharger la piece jointe sur le serveur ....
 
En fait, je n'ai meme pas besoin de l'enregistrer sur le serveur mais simplement de la lire (c'est pour une base de donnée qui supporte les objets spéciaux).
 
Mais je ne sais pas comment faire pour lui dire d'aller chercher sur C:\toto\mon_fichier.txt de la machine utilisateur et pas serveur.
 
Tous les exemples et aides que j'ai trouvées sont pour Perl et j'ai rien compris.
 
Quelqu'un peut il m'aider ?
Merci beaucoup
Damien

mood
Publicité
Posté le 21-06-2004 à 15:42:54  profilanswer
 

n°771496
Worldofdad​a
Posté le 21-06-2004 à 15:43:38  profilanswer
 

Petit détail, si je l'ai mis dans cette catégorie, c'est parce que c'est là où ca me semblait le plus logique (pas vu de categ CGI)

n°771542
T509
$job-&gt;GetJob(now)
Posté le 21-06-2004 à 16:13:26  profilanswer
 

L'upload se fait depuis une page qui est vue depuis le navigateur du visiteur. Le fichier est envoyé par le navigateur au serveur web qui gère ton CGI. Ensuite ton script doit aller chercher la pièce jointe dans le dossier temporaire du serveur ou dans celui qui est dédié à l'upload.
 
C'est sur cette bas là que tu dois travailler je crois.

n°771774
Worldofdad​a
Posté le 21-06-2004 à 17:57:34  profilanswer
 

Ok, déjà j'ai un petit doute en moins.
Apparemment, c'est le serveur qui copie chez lui le fichier tout seul.
 
Maintenant me reste a savoir comme faire le lien entre un toto.txt passé dans un champs file en un nom de fichier temporaire présent sur le serveur et que je peux exploiter.
 
Quelqu'un peut m'aider ?
Merci

n°771824
T509
$job-&gt;GetJob(now)
Posté le 21-06-2004 à 18:48:27  profilanswer
 

va voir la doc d'upload de PHP, il y a des infos sur le fonctionnement de l'upload et du nommage des fichiers temporaires. Peut-être même qu'en allat voir les sources des fonctions PHP qui on trait au fichiers uploadés, tu devrais trouver la solution. Les sources sont en c++ il me semble.
 
Pourquoi utiliser un CGI en C ? quel intérêt par rapport au PHP ou à l'ASP ?

n°771837
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 21-06-2004 à 18:55:23  profilanswer
 

T509 a écrit :


Pourquoi utiliser un CGI en C ? quel intérêt par rapport au PHP ou à l'ASP ?


DocMaboul a fait des émules avec son forum en C qui éclate tous les autres :D


---------------
J'ai un string dans l'array (Paris Hilton)
n°772405
Worldofdad​a
Posté le 22-06-2004 à 10:35:58  profilanswer
 

T509 a écrit :


Pourquoi utiliser un CGI en C ? quel intérêt par rapport au PHP ou à l'ASP ?


 
Parce que je n'ai pas le choix.
Ils avaient déjà commencé l'outils en CGI et il est impossible de toute facon de faire autrement : connexion a une base de donnée (tres spéciale) en utilisant des kits de développements écrits en C.
Je parle pas de l'ASP parce qu'il me provoque des crises d'urticaires ...  :pt1cable:  
 
Je vais aller voir pour la doc PHP mais je vois pas trop en quoi ca peut m'aider (quand je l'avais fais en PHP, j'avais utilisé des fonctions propres a ce langage et ca m'étonnerais qu'elles soient exportables en C).
 
Merci .... to be continued
Damien

n°772430
T509
$job-&gt;GetJob(now)
Posté le 22-06-2004 à 10:51:42  profilanswer
 

Je t'ai parlé aussi des sources php qui elle sont dispo et écrites en C. En jettant un rapide coup d'oeil, il y a des sources dédiées aux fichiers temporaires, d'autres dédiées aux globals

n°772431
kadreg
profil: Utilisateur
Posté le 22-06-2004 à 10:52:08  profilanswer
 

Harkonnen a écrit :

DocMaboul a fait des émules avec son forum en C qui éclate tous les autres :D


 
faudrait faire un essai avec un module apache :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°772555
Worldofdad​a
Posté le 22-06-2004 à 12:14:44  profilanswer
 

Je viens de regarder dans les sources des fonctions PHP et effectivement, je devrais pouvoir, avec pas mal de boulot m'en sortir ...
mais bon ...
 
Je suis prenneur d'une solution plus simple si quelqu'un la connait :)  
 
Merci beaucoup .... I'll be back en cas de pbs

mood
Publicité
Posté le 22-06-2004 à 12:14:44  profilanswer
 

n°772618
docmaboul
Posté le 22-06-2004 à 13:22:48  profilanswer
 

Worldofdada a écrit :

Salut !
En fait, je n'ai meme pas besoin de l'enregistrer sur le serveur mais simplement de la lire (c'est pour une base de donnée qui supporte les objets spéciaux).


 
Normalement, il doit y avoir une page avec une form ayant pour attribut ENCTYPE="multipart/form-data". Après, il faut dans la form un champ input avec le type "file" et il suffit ensuite de décoder les données postées côté serveur (réception sur stdin dans un cgi si mes souvenirs sont bons).
 
ps: et j'emmerde ceux qui disent je connais rien au html :D

n°772634
Worldofdad​a
Posté le 22-06-2004 à 13:35:35  profilanswer
 

ouais mais justement, c'est sur les données postées coté serveur que je cale.
 
Je pense pas que ce soit le HTML qui copie tout seul le fichier sur le serveur (sous la forme d'un fichier temporaire). Non ?
 
En gros, est ce le HTML qui upload le fichier et si oui, comment récupérer le nom du fichier temporaire ?
Apres, j'arriverais certainement a me dépatouiller du décodage des données.
 
Merci beaucoup

n°772777
docmaboul
Posté le 22-06-2004 à 14:45:14  profilanswer
 

Worldofdada a écrit :

ouais mais justement, c'est sur les données postées coté serveur que je cale.
 
Je pense pas que ce soit le HTML qui copie tout seul le fichier sur le serveur (sous la forme d'un fichier temporaire). Non ?


 

Citation :

En gros, est ce le HTML qui upload le fichier et si oui, comment récupérer le nom du fichier temporaire ?


 
Le browser client envoie les données (le contenu du fichier + quelques conneries) au serveur lorsque le type clique sur le submit de la form (dans sa page web). Je pense qu'au niveau du cgi, il faut faire un fread sur stdin pour récupérer ces données. Après, il faut se démerder pour récupérer la valeur du header content-length (ou quelque chose de ce style) histoire de contrôler que l'upload est bien terminé. Je pense que vous trouverez toutes les infos nécessaires dans la rfc du protocole http.

n°773014
Worldofdad​a
Posté le 22-06-2004 à 17:38:03  profilanswer
 

Humm .... oki oki
 
Je regarde ca demain :)


Message édité par Worldofdada le 22-06-2004 à 17:38:20
n°774040
Worldofdad​a
Posté le 23-06-2004 à 11:19:25  profilanswer
 

Alors, je viens de faire un :
fscanf(stdin, "%s", temp);
 
et en affichant temp, il me marque C:\temp.txt
En gros, il me donne rien de plus que le chemin et le nom du fichier chez le client et non sur le serveur.
Je comprends meme pas comment il peut récupérer ca (c'est de la magie pour moi) mais je desepere pas ...
 
J'ai fais un mauvais truc ?
Il devrait me retourner pleins de champs. Non ?
 
Merci

n°774189
docmaboul
Posté le 23-06-2004 à 13:08:10  profilanswer
 

j'ai fait un test pour vous.
 
pour la page:

Code :
  1. <html>
  2.     <body>
  3.         <form enctype="multipart/form-data" method="post" action="/cgi-bin/my-test">
  4.             <input type="file" name="the_file"></input>
  5.             <input type="submit" name="submit" value="send the file"></input>
  6.         </form>
  7.     </body>
  8. </html>


 
pour le cgi:

Code :
  1. #include <stdio.h>
  2. int main(char ** argv, int argc)
  3. {
  4.     FILE * fp=fopen("/tmp/toto", "wb" );
  5.     char tmp[1024];
  6.     int nRead;
  7.     while (nRead=fread(tmp, 1, 1024, stdin))
  8.     {
  9.         fwrite(tmp, 1, nRead, fp);
  10.     }
  11.     fclose(fp);
  12.     return 0;
  13. }


 
Et, ô miracle, vous avez les données postées dans le fichier /tmp/toto sur le serveur. Par contre, je n'ai pas regardé comment récuperer la longueur du fichier envoyé, je suppose que cela doit être une variable d'environnement (comme l'upload est probablement fait de manière asynchrone il faut que vous testiez que toutes les données ont été reçues et que vous fassiez une boucle d'attente avec un petit timeout sinon vous allez faire un cgi qui ne marche que sur un réseau local et encore...)

n°774262
Worldofdad​a
Posté le 23-06-2004 à 14:10:37  profilanswer
 

Merci beauoup pour cette réponse détaillée (peu de gens répondent aussi bien).
 
Mais j'ai tout de meme un petit problème : il ne passe jamais dans la boucle (j'ai fais un test en affichant les valeurs de nRead avant la boucle et a chaque itération mais seul le premier, c'est à dire avant la boucle s'affiche).
 
Celà voudrait donc dire que mon stdin est vide si je comprends bien.
D'ailleurs, si je fais le fscanf de tout à l'heure, ca me retourne une chaine vide (je pense que j'ai pas du afficher la bonne chaine de caracteres tout à l'heure parce que je vois pas ce qui aurait pu changer).
 
/cgi-bin/my-test est bien un executable ? (comme je m'y connais peu en CGI, peut etre qu'il n'y a pas que des exe)
 
Je me demande aussi si ca vient pas du fait que je renseigne jamais les Content-type:  ....  Je ne sais pas où ca pourrait se mettre ...
 
Merci beaucoup pour votre aide


Message édité par Worldofdada le 23-06-2004 à 14:23:44
n°774567
docmaboul
Posté le 23-06-2004 à 16:50:30  profilanswer
 

Là, je ne peux guère vous aider plus que ça. Oui, my-test est l'exécutable qui correspond au source (et oui, il n'y a pas que des "binaires exécutables" comme cgi. En fait, vous pourriez en faire dans n'importe quel bousin que votre os peut exécuter).
 
S'il ne reçoit rien, cela peut être à cause du temps de transmission des données (c'est pour cette raison que vous devez récupérer le content-length et faire la boucle d'attente). Essayez d'ajouter un appel à la fonction Sleep (pour win32 ou usleep sous linux ) histoire d'attendre 1 ou 2 secondes avant la boucle. Vous faites vos tests sur un réseau local (rapide)?

n°774656
Worldofdad​a
Posté le 23-06-2004 à 17:56:51  profilanswer
 

Je fais les tests sur un réseau assez rapide (je ne vois pas de temps d'attente).
 
Ce que je ne comprends pas, c'est pourquoi mon stdin est vide alors qu'il devrait apparemment etre plein ?
Il se crée tout seul ?
 
En fait, pour plus de précisions, lorsqu'un utilisateur appelle un .html, c'est un .exe qui est appellé et qui génère un .html ....
 
Merci beaucoup


Message édité par Worldofdada le 23-06-2004 à 17:57:13
n°776120
Worldofdad​a
Posté le 24-06-2004 à 15:15:15  profilanswer
 

Personne ne peut m'aider plus ?
 
Toujours pas réussi a récupérer un stdin non vide ...
J'ai matté le fichier log du serveur Apache et pas d'erreurs

n°776125
T509
$job-&gt;GetJob(now)
Posté le 24-06-2004 à 15:18:12  profilanswer
 

Tu as posé la question dans la rubrique C ? Il y a peut-être plus de gens compétant là bas ?
En C, je ne peux pas t'aider.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°776240
Worldofdad​a
Posté le 24-06-2004 à 16:07:20  profilanswer
 

ok, je vais poster ca là bas alors :)

n°776263
T509
$job-&gt;GetJob(now)
Posté le 24-06-2004 à 16:22:24  profilanswer
 

Bonne chance !
 


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [CGI - C] Upload de fichier

 

Sujets relatifs
pb accent aigu dans fichier batchmodification d'un fichier en fonction du nombre de ligne / char.
empecher un fichier php de s'executer...[ Résolu ] Importer fichier .sql
[c#][vs.NET]executer un fichier mp3[java] performance d'une copie de fichier
Utiliser une variable dans un autre fichierPhp & Mysql ou Php et fichier texte
Supprimer les fichier contenu ds Temp avec un .bat a chaque reboot??Modifier un fichier Excel
Plus de sujets relatifs à : [CGI - C] Upload de fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR