Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > ERP > SAP
SAP Forum d'entraide sur SAP et sur la programmation avec le langage ABAP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2007, 11h50   #1
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
Par défaut probleme d'upload de fichiers

Bonjour,

Je voudrais uploader des fichiers sur un serveur en ABAP/BSP. Mon fichier s'upload bien sur le serveur, mais il ne garde pas le nom d'origine du fichier. En effet, celui ci est renommé en 000000000.xls. Comment résoudre se problème et faire un processus générique permettant d'uploader n'importe quel fichier sur le serveur?

Mon OnInputProcessing :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
* event handler for checking and processing user input and
* for defining navigation
* file upload and echo
  data : filename       type string. "Nom du fichier
  data : entity         type ref to if_http_entity,
         file           type xstring,
         content_type   type string,
         content_length type string,
         num_multiparts type i,
         i              type i value 1,
         doEcho         type string.
*     " Récupération du contenu du fichier
*     " find multipart containing file
      num_multiparts = request->num_multiparts( ).
      while i <= num_multiparts.
        entity = request->get_multipart( i ).
        filename = entity->get_header_field( '~content_filename' ).
        if filename is initial.
          i = i + 1.
          continue.
        endif.
*       found a file!
        navigation->set_parameter( name  = 'content_filename'
                                   value = filename ).

        content_type = entity->get_header_field( 'Content-Type' ).
        navigation->set_parameter( name  = 'content_type'
                                   value = content_type ).

*       get file content
        file = entity->get_data( ).

*       get file size
        content_length = xstrlen( file ).
*       "recupération du contenu et découpe
        application->save_file( file = file ).
        if application->error_code is initial.
          exit.
        endif.

        i = i + 1.
      endwhile.
      endcase.
Ma méthode save_file :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
method SAVE_FILE .

* Sauvegarde du fichier
* " création du nom du fichier
  data : urlout type string.
  data : fic    type string.
  data : request type ref to if_http_request.
* Création du fichier de sortie
  concatenate  '/transfert/'
               sy-sysid sy-mandt
               '/ZSERVER_HTTP/out/'
               zwu_dem_admin-zwu_num_dem
               '.xls'
               into fic.
  OPEN DATASET fic for output in binary mode.

  if sy-subrc <> 0.
  exit.
  endif.
  transfer file to fic.
  if sy-subrc <> 0.
  exit.
  endif.
  CLOSE DATASET fic.

endmethod.
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2007, 17h19   #2
Membre du Club
 
Inscription : mars 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 62
Points : 61
Points : 61
Salut,
as tu essayé de mettre un point d'arret dans ton code et de regarde la valeur
Citation:
zwu_dem_admin-zwu_num_dem
?
Je ne vois aucune affectation dans ton code concernant cette valeur.
Blash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 10h38   #3
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
Par défaut Marche toujours pas

Salut,
Merci pour ta réponse Blash. J'ai essayé de mettreun point d'arrêt sur zwu_dem_admin-zwu_num_dem, mais il me sort pas de valeurs. Je sèche literallement. Je ne comprends pas pourquoi il me renomme mes fichiers.

Si tu as une idée elle serait la bienvenue parce que là je gallère.

Merci.
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 11h01   #4
Membre du Club
 
Inscription : mars 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 62
Points : 61
Points : 61
S'il ne te sort pas de valeur c'est qu'il est nul. Donc quand tu le concatene au reste de la chaine, vu que sa a l'air d'etre un champ type Num(9) ou C(9) il met des 0 dedans. Donc dans ton code de save file soit tu affectes une valeur a ce champ, soit c'est autre par. Je ne connais pas les BSP, mais je vois que dans le code tu retiens le nom de fichier en utilisant
Code :
1
2
navigation->set_parameter( name  = 'content_filename'
                                   value = filename ).
Si tu veux nommer le fichier avec le meme nom que celui uploadé, essaie de faire une affectation du genre
Code :
1
2
3
zwu_dem_admin-zwu_num_dem = navigation->get_parameter( name  = 'content_filename'
   value = filename ).
sinon dit moi quel nom tu veux pour ton fichier sur le serveur on regardera ensemble.
Blash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 10h34   #5
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
Salut,

J'ai essayé de voir dans mon programme où j'affecte ces zéros mais je ne vois pas. J'ai essayé de changer la ligne que tu m'as dis par :

Code :
1
2
3
zwu_dem_admin-zwu_num_dem = navigation->get_parameter(
name  = 'content_filename' value = filename ).
Mais ça me génère une erreur lorsque je veux activer ma fonction :
Statement concluding with "...)" ended unexpectedly.

là je sèche litteralement. Si tu as une idée ça m'aiderais beaucoup.

Merci beaucoup pour ton aide précieuse.
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h00   #6
Membre du Club
 
Inscription : mars 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 62
Points : 61
Points : 61
Non tu n'affectes pas des 0. C'est le systeme qui le fait vu que le champ est vide.

Par mon exemple de code je te proposais de voir si quelquechose du genre existait.

Une solution possible est de modifier les parametres de la méthode
Code :
application->save_file( file = file ).
en
Code :
1
2
  application->save_file( file = file
                                           im_filename = filename).
et apres dans l'implementation de save_file

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
* Sauvegarde du fichier
* " création du nom du fichier
  data : urlout type string.
  data : fic    type string.
  data : request type ref to if_http_request.
* Création du fichier de sortie
  concatenate  '/transfert/'
               sy-sysid sy-mandt
               '/ZSERVER_HTTP/out/'
*               zwu_dem_admin-zwu_num_dem
*               remplacer par
               im_filename
               '.xls'
               into fic.
  OPEN DATASET fic for output in binary mode.

  if sy-subrc <> 0.
  exit.
  endif.
  transfer file to fic.
  if sy-subrc <> 0.
  exit.
  endif.
  CLOSE DATASET fic.
n'oublie pas de changer la signature de la méthode. Bon courage
Blash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h33   #7
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
Merci beaucoup pour ton aide. J'aurais juste besoin d'une petite précision :

Le code :

Code :
application->save_file( file = file ).
Je dois le changer en :

Code :
application->save_file( im_filename = filename ).
Par contre, im_filename sera un xstring et filename un string. Ca va pas me générer une erreur de compatibilité?
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h39   #8
Membre du Club
 
Inscription : mars 2007
Messages : 62
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 62
Points : 61
Points : 61
non tu dois le changer en
Code :
1
2
application->save_file( file = file
                                im_filename = filename).
c'est a dire ajouter un parametre a ta méthode.

change la signature de ta méthode de
Code :
1
2
methods: save_file importing file type xstring.
en
Code :
1
2
3
methods: save_file importing file type xstring
                                        im_filename type string.
Blash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 15h30   #9
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
Salut Blast,
Merci pour ton aide. J'ai suivi tes instructions et ça marche. Le fichier est bien "uploadé" sur le serveur avec son nom d'origine. Le seul hic, c'est que le fichier qui est transféré sur le serveur est enregistré sous le nom du chemin d'origine du fichier qui a été uploadé.

Je sais pas si c'est clair ce que j'ecris, donc en fait, si j'upload test.xls qui se trouve sur mon disque C: et dans le répertoire temp, lorsque j'upload mon fichier test.xls mon programme lui affecte comme nom : c:\test.xls.xls sur le serveur. Est qu'il y aurait un moyen d'upload uniquement le nom du fichier sur le serveur ?

En tout cas je te remercie énormément pour toute l'aide que tu m'as apporté.
Merci encore.
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2007, 14h18   #10
Invité de passage
 
Inscription : mai 2007
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 14
Points : 2
Points : 2
J'ai trouvé la solution. J'ai rajouté quelques lignes dans mon OnInputProcessing afin d'éliminer les slash. Je poste ici ma solution :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
split filename at '.' into s suff.

        s2 = filename.
        find '\' in s2.
        if sy-subrc = 0.
        sep = '\'.
        else.
        sep ='/'.
        endif.

*         Récupère le nom de l'objet
        while s2 <> ''.

       split s2 at sep into s1 s2.

       endwhile.

       filename = s1.


        application->save_file( file = file
                                im_filename = filename ).
@+
Et merci à Blash pour ton aide
Jarod1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h40.


 
 
 
 
Partenaires

Hébergement Web