ZIP MIME-Type hinzufügen
ZIP MIME-Type hinzufügen
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)
Re: ZIP MIME-Type hinzufügen
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)
- 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
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
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
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
- 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
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):
Manual, Source usw. hier: http://www.nih.at/libzip/
Beispiel Import:
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
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
EndProcedureBeispiel 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)
EndImportaber 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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
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.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.
Davon abgesehen verstehe ich nicht wie BASE64 da helfen soll. Ein ZIP-Datei komprimiert immer verlustfrei. Und zwar jede binäre Art von Daten.
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.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.
@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.
Re: ZIP MIME-Type hinzufügen
@Nic: Ja - du hast es exakt erfasst. Das Geheimnis ist gelüftet
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...
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)
- 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
Hier mal der komplette Code, aber bisher ungetested, da das ganze unter Linux nicht funktioniert (PackerID kann nicht ermittelt werden
)
Gruß
Thomas
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: ZIP MIME-Type hinzufügen
Epub-Check sagt: I/O error: invalid CEN header (bad signature)
Was bedeutet das?
Was bedeutet das?
(Win 11 64-bit, PB 6.04 und 6.10)
- 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
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: ZIP MIME-Type hinzufügen
@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)