FileDownload und FileUpload mit ZIP

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

ABAP Web Dynpro, BusinessServerPages; Erstellung von Webapplikationen.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

FileDownload und FileUpload mit ZIP

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hallo,

und zwar bin ich derzeit an einer Web-Dynpro Anwendung die Datein sowohl aus dem Kontext herunterladen soll,
also auch in den Kontext herein.

Dies soll mithilfe von ZIP geschen. Also ich habe einen Tabelleninhalt mit sagen wir 2 Dateinen, bei Klick auf den Button "Dateinen herunterladen" sollen diese beiden Dateien zu ZIP komprimiert werden
und zum Download bereitstehen.
Beim hochladen genau das selbe. EIn Zip-Ordner mit beliebigen XML-files sollen ausgewählt werden und dekomprimiert werden und sollen in den Kontext gestellt werden.

Wie das Download und das Upload ansich funktioniert weiß ich bereits (also bei einzelnen Dateien) nur das mit dem Zip ist noch eine rießen große Black-Box.
Ich weiß zwar durch die Klasse CL_ABAP_ZIP kann man dieses ZIP Files dann ohne großen Aufwand entpacken und weiterverarbeiten.
Aber wie sieht das Coding dann aus?
Und kann man mit dieser Klasse auch komprimieren & wie muss ich es beim FIleDownload-Element handhaben?

Ich hoffe ihr könnt mir etwas licht in das Dunkle bringen.

Liebe Grüße
Julia
Zuletzt geändert von Trulchen am 26.03.2013 09:10, insgesamt 2-mal geändert.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: FileDownload und FileUpload mit ZIP

Beitrag von Thanatos82 (Expert / 699 / 32 / 123 ) »
Hi :)

also ohne tiefer reinzuschauen: die klasse cl_abap_zip enthält auch die Methode SAVE, die eine ZIP erstellt. Ablauf müsste rein theoretisch dann ähnlich der entpackungslogik sein, sprich du datenstrom übergeben und ergebnis erhalten. hoffe das hilft dir bissl weiter.
Gruß,
der Matze

Re: FileDownload und FileUpload mit ZIP

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hm okay,

also habe ein Coding jetzt zum Entpacken gefunden und es angepasst auf meinen Fall:

Code: Alles auswählen.

method ONACTIONSTART_UPLOAD.

  DATA lo_nd_file_upload TYPE REF TO if_wd_context_node.
  DATA lo_el_file_upload TYPE REF TO if_wd_context_element.
  DATA ls_file_upload TYPE wd_this->Element_file_upload.
  DATA lo_nd_tabfileinfo TYPE REF TO if_wd_context_node.
  DATA it_tabfileinfo TYPE TABLE OF wd_this->Elements_tabfileinfo.
  DATA lo_el_tabfileinfo TYPE REF TO if_wd_context_element.
  DATA: obj_zip TYPE REF TO cl_abap_zip.

* Get upload data from context
  lo_nd_file_upload = wd_context->path_get_node( 'FILE_UPLOAD' ).
  lo_el_file_upload = lo_nd_file_upload->get_element( ).
  lo_el_file_upload->get_static_attributes( IMPORTING static_attributes = ls_file_upload ).

* Check if file is zipped
  IF ls_file_upload-mimetype = 'application/x-zip-compressed'.
* Create ZIP object
    CREATE OBJECT obj_zip.

* Unzip data
    obj_zip->load( ls_file_upload-file_content ).

    obj_zip->get( EXPORTING index = 1
                  IMPORTING content = ls_file_upload-file_content
                  EXCEPTIONS zip_index_error = 1
                             zip_decompression_error = 2
                             OTHERS = 3 ).
  ENDif.

* Set data back to context
  lo_el_file_upload->set_static_attributes( static_attributes = ls_file_upload ).

  FREE: lo_nd_file_upload, lo_el_file_upload, obj_zip.
  CLEAR: ls_file_upload.


endmethod.
Nur fehlt hier, an dem bin ich bisher kläglich gescheitert, das ich herausbekomme wie viele Dateinen in dem ZIP drin waren
und wie dort die einzelnen XSTRINGS davon sind bzw. wie lang die XSTRINGS gehen bis zur nächsten Datei ..... - Kapiert man das? :D
Also ich will nachher in einer Tabelle ausgeben da drin waren 2 Dateinen mit der bestimmten FILE-Größe und des bestimmten FIle-Namens.

An das Downloaden habe ich mich noch nicht herangetraut.
Aber ich versuche es mal mit der Methode SAVE danke... :)

Re: FileDownload und FileUpload mit ZIP

Beitrag von Thanatos82 (Expert / 699 / 32 / 123 ) »
Schau dir mal die Methoden der Klasse in der SE24 an.. GET dürfte dir hier weiterhelfen.. und die Methode CRC32 dürfte dir den gewünschten Wert als integer zurückgeben, wenn ich das beim querlesen über google jetzt richtig verstanden habe. Und um deine Tabelle zu erstellen, würd ich es mit einem Loop oder nem READ versuchen und dabei pro GET eine tabellenzeile erzeugen. :)

EDIT: Schau dir mal die Parameter der GET Methode an.. per Index kannste durch deine ZIP Datei loopen, solange sy.subrc dabei 0 bleibt is'ne datei vorhanden und du kannst das in deine Tabelle füllen. Und Content gibt dir dann sogar den XString zurück ;)
Gruß,
der Matze

Re: FileDownload und FileUpload mit ZIP

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Thanatos82 hat geschrieben:Schau dir mal die Methoden der Klasse in der SE24 an.. GET dürfte dir hier weiterhelfen.. und die Methode CRC32 dürfte dir den gewünschten Wert als integer zurückgeben, wenn ich das beim querlesen über google jetzt richtig verstanden habe. Und um deine Tabelle zu erstellen, würd ich es mit einem Loop oder nem READ versuchen und dabei pro GET eine tabellenzeile erzeugen. :)

EDIT: Schau dir mal die Parameter der GET Methode an.. per Index kannste durch deine ZIP Datei loopen, solange sy.subrc dabei 0 bleibt is'ne datei vorhanden und du kannst das in deine Tabelle füllen. Und Content gibt dir dann sogar den XString zurück ;)
Habe jetzt die Methode CRC32 ausgefüht.

Code: Alles auswählen.

CALL METHOD CL_ABAP_ZIP=>CRC32
  EXPORTING
    CONTENT = ls_file_upload-file_content
  RECEIVING
    CRC32   = test.
Als wer für CRC32 ( der Integer) kommt laut Debugger: 335423296 raus... Was kann ich damit anfangen? Du sagt ich bekomm damit den gewünschten Wert?

Und mal wieder mein Feind der LOOP.... Also eine Loop über die obj_zip_get?
Oder danach?

Das mit dem Index durchloopen habe ich noch nicht so verstanden. Was meinst du damit? Der Index ist doch ein einfacher nteger.
Zuletzt geändert von Trulchen am 13.03.2013 13:27, insgesamt 1-mal geändert.

Re: FileDownload und FileUpload mit ZIP

Beitrag von Thanatos82 (Expert / 699 / 32 / 123 ) »
Das mit dem CRC lass erstmal weg. Die GET Methode scheint völlig zu reichen, wenn ich deine Anforderungen richtig verstehe.
Genau du machst einen Loop darüber und zählst eine eigene index-variable mit hoch, also lv_index = lv_index + 1. und das lv_index übergibst du an die GET Methode. Dann teste die sy-subrc, solange die 0 ist, ist ein Eintrag vorhanden und diesen bekommst du dann in einem xstring zurück. Wenn diesy-subrc was anderes als 0 liefert, heißt das, dass an der angegebenen Index stelle kein Wert gefunden werden kann, du hast also das Ende deiner Zip-Datei erreicht und die Anzahl deiner Dateien in der Zip wäre dann lv_anzahl = lv_index - 1. :) verständlicher?
Gruß,
der Matze

Re: FileDownload und FileUpload mit ZIP

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hört sich logisch an aber praktisch habe ich es noch nicht geschafft

Code: Alles auswählen.

     LOOP at it_file_upload INTO  ls_file_upload.
     lv_index = lv_index + 1.
       IF sy-subrc = 0.   
          obj_zip->get( EXPORTING index = lv_index
                            name = ls_file_upload-filename
                  IMPORTING content = ls_file_upload-file_content
                  EXCEPTIONS zip_index_error = 1
                          zip_decompression_error = 2 ).  
      ENDIF.
     lv_anzal = lv_index - 1. 
    ENDLOOP.
HIer mein Ansatz... .
Er springt mir über die LOOP.

Re: FileDownload und FileUpload mit ZIP

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Oder du versuchst mal die CL_ABAP_ZIP=>SPLICE Methode.
Soweit ich das überblickt habe, werden hier alle Dateien die aktuell in der ZIP drinnenstehen ausgelesen.

Der Nachteil der GET Methode ist nämlich, dass auch gleich die Daten entpackt werden und so in den Speicher geladen werden.
Das dürfte nicht sehr performant sein.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: FileDownload und FileUpload mit ZIP

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Oder noch einfacher:
Alle Dateien des ZIP Archiv sollten im Attribut FILES nach dem LOAD drinnenstehen.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: FileDownload und FileUpload mit ZIP

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
a-dead-trousers hat geschrieben:Oder noch einfacher:
Alle Dateien des ZIP Archiv sollten im Attribut FILES nach dem LOAD drinnenstehen.
Da brauchst du dann nur noch den LOOP damit durchführen und darin die GET Methode ausführen um die Daten auszulesen.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50


Re: FileDownload und FileUpload mit ZIP

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Trulchen hat geschrieben:Du meinst das ganze so machen?

http://wiki.sdn.sap.com/wiki/display/Sn ... ZIP+Folder
Ja, siehe auch meine PM.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: FileDownload und FileUpload mit ZIP

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
So dank ADT die Lösung :)

Code: Alles auswählen.


  DATA lo_nd_file_upload TYPE REF TO if_wd_context_node.
  DATA lo_el_file_upload TYPE REF TO if_wd_context_element.
  DATA it_file_upload TYPE TABLE OF wd_this->Element_file_upload.
  DATA lo_nd_tabfileinfo TYPE REF TO if_wd_context_node.
  DATA it_tabfileinfo TYPE TABLE OF wd_this->Elements_tabfileinfo.
  DATA lo_el_tabfileinfo TYPE REF TO if_wd_context_element.
  DATA: obj_zip TYPE REF TO cl_abap_zip.
  DATA it_file_zip TYPE TABLE OF wd_this->Element_file_upload.
  DATA: ls_file_zip TYPE wd_this->Element_file_upload.
  DATA: ls_files TYPE LINE OF obj_zip->t_files.
  DATA: ls_file_upload TYPE wd_this->Element_file_upload.


* Get upload data from context
  lo_nd_file_upload = wd_context->path_get_node( 'FILE_UPLOAD' ).
  lo_el_file_upload = lo_nd_file_upload->get_element( ).
  lo_el_file_upload->get_static_attributes( IMPORTING static_attributes = ls_file_upload ).

* Check if file is zipped
  IF ls_file_upload-mimetype = 'application/x-zip-compressed'.
* Create ZIP object
    CREATE OBJECT obj_zip.
* Unzip data
      obj_zip->load( ls_file_upload-file_content ).

      LOOP at obj_zip->files INTO ls_files.
        append ls_file_zip to it_file_zip.
        ls_file_zip-filename = ls_files-name.
        obj_zip->get( EXPORTING name = ls_files-name
                      IMPORTING content = ls_file_zip-file_content
                      EXCEPTIONS zip_index_error = 1
                              zip_decompression_error = 2 ).

       ls_file_zip-file_size = ls_files-size.

     ENDLOOP.


  ENDif.

  lo_nd_file_upload->bind_table(
  new_items = it_file_zip
  set_initial_elements = abap_true
  ).

Folgende Benutzer bedankten sich beim Autor Trulchen für den Beitrag:
Icke0801


Seite 1 von 1

Vergleichbare Themen

0
Antw.
2103
Views
Webdynpro: FileDownload protokollieren???
von Nescio » 08.03.2016 20:27 • Verfasst in Web-Dynpro, BSP + BHTML
3
Antw.
1457
Views
Steuerung des Speicherorts bei FileDownload
von Trulchen » 24.01.2013 11:53 • Verfasst in ABAP® Core
1
Antw.
902
Views
Automatisch beim Filedownload ein Excelmakro ausführen
von axxter » 10.01.2007 14:08 • Verfasst in ABAP® Core
1
Antw.
3341
Views
Dynpro mit FileUpload
von Shaguar » 22.04.2013 12:05 • Verfasst in Dialogprogrammierung
4
Antw.
2856
Views
FileUpload für mehrere Bilder
von D4ntey » 20.07.2015 12:24 • Verfasst in Web-Dynpro, BSP + BHTML

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 14 Minuten von ewx 17 / 10779
Dialog-Container mit Toolbar/Status
vor 24 Minuten von tar gelöst 26 / 3911
User Exit EXIT_RQCPRM10_001
vor 22 Stunden von a-dead-trousers 2 / 360
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1414

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 14 Minuten von ewx 17 / 10779
Dialog-Container mit Toolbar/Status
vor 24 Minuten von tar gelöst 26 / 3911
User Exit EXIT_RQCPRM10_001
vor 22 Stunden von a-dead-trousers 2 / 360
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1414

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2941
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9534