ZIP MIME-Type hinzufügen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

ZIP MIME-Type hinzufügen

Beitrag von Sebastian »

Ich möchte eine Zip-Datei erstellen, in der ein MIME-Type für die Datei spezifiziert wird. Diese Datei muss UNKOMPRIMIERT in die Zip-Datei inkludiert werden. Ich finde allerdings keine Möglichkeit in der Packer-Library, um die Kompressionsrate für eine Datei festzulegen. Bin ich blind? Wer kann mir helfen?
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: ZIP MIME-Type hinzufügen

Beitrag von Sebastian »

Ich bin leider noch immer ratlos. Ich habe schon damit experimentiert, Hex-Code in die Datei zu schreiben, aber leider führt das auch nicht zum gewünschten Ergebnis. Bitte! Gibt es niemanden, der hier einen Rat weiß?
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
TroaX
Beiträge: 720
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: ZIP MIME-Type hinzufügen

Beitrag von TroaX »

Also mit der integrierten Bibliothek kann man die Kompressionsrate nicht festlegen. Außerdem wäre es mir neu, das man für einzelne Dateien in einem Archiv eine Komprimierung-Rate festlegen kann. Bisher ging das meines erachtens nur für das gesamte Archiv.

Das einzige, was mir da jetzt einfallen würde ohne großen Aufwand und Plattformunabhängig: Wenn ich das richtig verstehe ist diese MIME-Type Datei eine Textdatei. Wenn dem so ist setze die als ASCII auf und konvertiere den Inhalt mal in Base64 und schmeiß die Datei dann mal ins Archiv. Beim entpacken mit deinem Programm kannst du den Inhalt der Datei wieder zurückkonvertieren. Wenn das Ergebnis stimmt, dann sollte die Komprimierung an der Stelle keine Auswirkung haben und du musst dir keine Sorgen zwecks Datenverlust tun.

Die zweite Lösung wäre eine externe Kompressions-Bibliothek. Das ist aber mit weitaus mehr Aufwand verbunden und unter Umständen nicht Plattformunabhängig.

Für weitere Lösungsmöglichkeiten wären etwas präzisere Angaben notwendig. Was für Dateien, warum, wiese weshelb. Weil dann kann man etwas präzisere Hilfe geben ;-)

Zum Thema Base64: Ob nun Mailanhänge oder Dateien beim übertragen über HTTP/S. Alle diese Dateien werden für die Übertragung in Base64 kodiert. Dadurch werden komplette Dateien in einen reinen String konvertiert und können so über ein Stringbasiertes Übertragungsprotokoll ausgetauscht werden. Dieser String ist im Regelfall ASCII-Konform, wodurch die Dateien nur mit einer bestimmten Anzahl an verschiedenen Zeichen abgebildet werden. Da die Kompression das Objekt als Text ansieht, hat die Kompression recht wenig Spielraum und kann das ganze verlustfrei komprimieren/dekomprimieren. Daraus dürfte dann problemlos eigentlich die Quelldatei verlustfrei widerhergestellt werden können.

So ist die Theorie. Müsste aber in der Praxis getestet werden.

Base64 Encoder: http://www.purebasic.com/german/documen ... coder.html
Base64 Decoder: http://www.purebasic.com/german/documen ... coder.html
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, Gambas
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ZIP MIME-Type hinzufügen

Beitrag von ts-soft »

Die von PB genutzte libzip unterstützt das, Du kannst also die native API verwenden.
Hier ein Beispielcode, wie Du an das benötigte Handle kommst (windows only):

Code: Alles auswählen

UseZipPacker()

Import ""
  PB_Object_IsObject(object, id)
  PB_Packer_Objects
EndImport

Procedure PackerID(id)
  Protected obj, hZip
  obj = PB_Object_IsObject(PB_Packer_Objects, id) 
  If obj
    hZip = PeekI(obj + 4 * SizeOf(integer))
  EndIf
  
  ProcedureReturn hZip 
EndProcedure
Manual, Source usw. hier: http://www.nih.at/libzip/

Beispiel Import:

Code: Alles auswählen

ImportC ""
  zip_add_dir(hZip.i, dir.p-utf8)
  zip_get_num_entries(hZip.i, flags.l = 0)
  zip_get_archive_comment(hZip.i, *lenp, flags.l = 0)
  zip_set_archive_comment(hZip.i, comment.p-utf8, length.l)
  zip_get_file_comment(hZip.i, index.q, *lenp, flags.l = 0)
  zip_set_file_comment(hZip.i, index.q, comment.p-utf8, length.l)
  zip_name_locate(hZip.i, fname.p-utf8, flags.l = 0)
  zip_set_default_password(hZip.i, password.p-utf8)
EndImport
Welche Funktionen Du exact benötigt und wie die anzuwenden sind überlasse ich Dir,
aber es ist laut Doku möglich, den Komprimierungsgrad festzulegen.
http://www.nih.at/libzip/zip_set_file_compression.html

Gruß
Thomas
Zuletzt geändert von ts-soft am 07.02.2014 14:00, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ZIP MIME-Type hinzufügen

Beitrag von NicTheQuick »

TroaX hat geschrieben:Das einzige, was mir da jetzt einfallen würde ohne großen Aufwand und Plattformunabhängig: Wenn ich das richtig verstehe ist diese MIME-Type Datei eine Textdatei. Wenn dem so ist setze die als ASCII auf und konvertiere den Inhalt mal in Base64 und schmeiß die Datei dann mal ins Archiv. Beim entpacken mit deinem Programm kannst du den Inhalt der Datei wieder zurückkonvertieren. Wenn das Ergebnis stimmt, dann sollte die Komprimierung an der Stelle keine Auswirkung haben und du musst dir keine Sorgen zwecks Datenverlust tun.
Ich glaube Sebastians Problem ist, dass er die ZIP-Datei zwar selbst erstellen will, sie aber später einem anderen Programm übergibt, an dem er nichts ändern kann. Dieses Programm verlangt vermutlich, dass bestimmte Teile der ZIP unkomprimiert sind.
Davon abgesehen verstehe ich nicht wie BASE64 da helfen soll. Ein ZIP-Datei komprimiert immer verlustfrei. Und zwar jede binäre Art von Daten.
Zum Thema Base64: Ob nun Mailanhänge oder Dateien beim übertragen über HTTP/S. Alle diese Dateien werden für die Übertragung in Base64 kodiert.
Mit den Mailanhängen hast du Recht, mit HTTP/S nicht. Das HTTP-Protokol unterstützt durchaus Binärdaten. Du musst dir nur mal anschauen, was dir ein Server schickt, wenn du ein beliebiges Bild von ihm lädst. Erst wenige Zeilen Klartext als Protokol-Header und dann kommen die binären Daten des Bildes.

@Sebastian:
Kann es sein, dass du versuchst ein E-Book im EPUB-Format zu erstellen? Die haben nämlich auch solche Spezialitäten wie man das ZIP behandelt.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: ZIP MIME-Type hinzufügen

Beitrag von Sebastian »

@Nic: Ja - du hast es exakt erfasst. Das Geheimnis ist gelüftet :allright:

Ich versuche in der Tat, eine EPUB-Datei zu erstellen. Um eine valide Datei zu erhalten, dürfen alle Dateien komprimiert werden - bis auf eine: Die MIME-Type Datei. Da ich mit der Packer-Bibliothek keine unkomprimierte Datei einfügen kann, bin ich inzwischen soweit, dass ich also alle Dateien komprimiere und dann in die ZIP-Datei einen Hex-Code einfüge. Soweit, so gut. ZIP-Container kann geöffnet werden (Datei ist also nicht beschädigt), die Iteration der beinhalteten Dateien habe ich korriegiert, die MIMETYPE-Datei ohne extra field eingefügt und die Datei auch als erste in den Header geschrieben. Und siehe da: Calibre öffnet die Datei dennoch nicht richtig. Alle Metadaten fehlen... ein deutliches Zeichen, dass es keine valide EPUB-Datei ist. Ich bin ratlos...
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ZIP MIME-Type hinzufügen

Beitrag von ts-soft »

Hier mal der komplette Code, aber bisher ungetested, da das ganze unter Linux nicht funktioniert (PackerID kann nicht ermittelt werden :cry: )

Code: Alles auswählen

UseZipPacker()

Import ""
  PB_Object_IsObject(object, id)
  PB_Packer_Objects
EndImport

Procedure PackerID(id)
  Protected obj, hZip
  obj = PB_Object_IsObject(PB_Packer_Objects, id)
  If obj
    hZip = PeekI(obj + 4 * SizeOf(integer))
  EndIf
 
  ProcedureReturn hZip
EndProcedure

#ZIP_CM_DEFAULT	= -1
#ZIP_CM_STORE	  = 0

ImportC ""
  zip_set_file_compression(hZip.i, index.q, comp.l, comp_flags.l = 0)
EndImport
; com_flags wird zur Zeit ignoriert
; für comp ist eine der beiden Konstanten zu setzen. #ZIP_CM_STORE für keine Kompression

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: ZIP MIME-Type hinzufügen

Beitrag von Sebastian »

Epub-Check sagt: I/O error: invalid CEN header (bad signature)
Was bedeutet das?
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ZIP MIME-Type hinzufügen

Beitrag von ts-soft »

Das bedeutet, das Du keine Lib für Zipfiles nutzen kannst, sondern das EPUB format mit zip-comprimierten Dateien.
Du mußt also eine Datei mit einem EPUB-Header erstellen als Zentral-Header, sowie für jede Datei einen Lokal-Header.
Komprimieren kannst Du dann mit Zlib.lib.
Mußt Du erstmal eine Formatbeschreibung suchen, oder vielleicht gibt es auch eine fertige Lib für EPUB.

ZIP wird als Packformat genutzt, aber nicht das Fileformat von ZIP.

Mein obiger Code nutzt Dir natürlich nach dieser Erkenntnis auch nichts. Umsonst recherchiert.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: ZIP MIME-Type hinzufügen

Beitrag von Sebastian »

@ts-soft: So ganz stimmt das wohl nicht, was du da beschreibst. Wenn man das ganze von Hand macht - also zunächst ein leeres ZIP-Verzeichnis erstellt, dann die mimetype-Datei von Hand speichert (also kein Kompressionsverfahren auswählt) und dann die weiteren Dateien komprimiert einfügt und die ganze Datei in .epub umbenennt, dann hat man eine valide Datei...
(Win 11 64-bit, PB 6.04 und 6.10)
Antworten