[CGI - C] Upload de fichier

Upload de fichier [CGI - C] - HTML/CSS - Programmation

Marsh Posté le 21-06-2004 à 15:42:54    

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

Reply

Marsh Posté le 21-06-2004 à 15:42:54   

Reply

Marsh Posté le 21-06-2004 à 15:43:38    

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)

Reply

Marsh Posté le 21-06-2004 à 16:13:26    

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.

Reply

Marsh Posté le 21-06-2004 à 17:57:34    

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

Reply

Marsh Posté le 21-06-2004 à 18:48:27    

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 ?

Reply

Marsh Posté le 21-06-2004 à 18:55:23    

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)
Reply

Marsh Posté le 22-06-2004 à 10:35:58    

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

Reply

Marsh Posté le 22-06-2004 à 10:51:42    

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

Reply

Marsh Posté le 22-06-2004 à 10:52:08    

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 !
Reply

Marsh Posté le 22-06-2004 à 12:14:44    

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

Reply

Marsh Posté le 22-06-2004 à 12:14:44   

Reply

Marsh Posté le 22-06-2004 à 13:22:48    

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

Reply

Marsh Posté le 22-06-2004 à 13:35:35    

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

Reply

Marsh Posté le 22-06-2004 à 14:45:14    

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.

Reply

Marsh Posté le 22-06-2004 à 17:38:03    

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


Message édité par Worldofdada le 22-06-2004 à 17:38:20
Reply

Marsh Posté le 23-06-2004 à 11:19:25    

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

Reply

Marsh Posté le 23-06-2004 à 13:08:10    

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...)

Reply

Marsh Posté le 23-06-2004 à 14:10:37    

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
Reply

Marsh Posté le 23-06-2004 à 16:50:30    

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)?

Reply

Marsh Posté le 23-06-2004 à 17:56:51    

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
Reply

Marsh Posté le 24-06-2004 à 15:15:15    

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

Reply

Marsh Posté le 24-06-2004 à 15:18:12    

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 !
Reply

Marsh Posté le 24-06-2004 à 16:07:20    

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

Reply

Marsh Posté le 24-06-2004 à 16:22:24    

Bonne chance !
 


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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed