data:;base64,aGVsbG8=
image.png
, background.png
style.css
,
properties.css
script.js
project/
Structure du projet
project/index.html
project/script.js
project/style.css
project/properties.css
project/image.png
project/background.png
Structure du projet
project/index.html
project/script.js
project/style.css
project/properties.css
project/image.png
project/background.png
Structure du projet
project/index.html
project/script.js
project/style.css
project/properties.css
project/image.png
project/background.png
Structure du projet
project/index.html
project/script.js
project/style.css
project/properties.css
project/image.png
project/background.png
DEFLATE
depuis la version 2.0
(1993)AES
depuis la version 5.2 (2003).ODT
, .DOCX
,
...).JAR
).APK
et Archives iOS .IPA
)
.CRX
et .XPI
)file entries
) suivies de l'annuaire central
(central directory
)local headers
) et l'annuaire central : nom du fichier, date de dernière
modification, taille des données ...relative offsets
) de
chacune des entrées dans le fichier ZIPCompressionStream
Exemple de création d'un fichier ZIP
import { ZipWriter, Uint8ArrayWriter } from "@zip-js/zip-js"
const zipDataWriter = new Uint8ArrayWriter()
const zipWriter = new ZipWriter(zipDataWriter)
for await (const { name } of readDirectory(inputFolder)) {
const readableStream = await readFileStream(name)
await zipWriter.add(name, readableStream)
}
await zipWriter.close()
const zipData = zipDataWriter.getData() // Uint8Array
console.log("zip file data:", zipData)
Création du fichier ZIP
index.html
index.js
lib/utils-zip.js
Création du fichier ZIP
index.html
index.js
lib/utils-zip.js
Création du fichier ZIP
index.html
index.js
lib/utils-zip.js
Création du fichier ZIP
index.html
index.js
lib/utils-zip.js
Exemple de lecture d'un fichier ZIP
import { ZipReader, BlobReader, BlobWriter } from "@zip-js/zip-js"
const zipReader = new ZipReader(new BlobReader(blob))
const entries = await zipReader.getEntries()
for (const entry of entries) {
const blob = await entry.getData(new BlobWriter())
console.log("file:", entry.filename, "blob:", blob)
}
await zipReader.close()
Lecture du fichier ZIP
index.html
index.js
Lecture du fichier ZIP
index.html
index.js
Lecture du fichier ZIP
<!--
-->
et fin du contenu HTMLTemplate du fichier HTML auto-extractible
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Please wait...</title>
<script><!-- Contenu de assets/zip.min.js --></script>
</head>
<body>
<p>Please wait...</p>
<script><!-- Contenu de assets/main.js --></script>
</body>
</html>
Template du fichier HTML auto-extractible
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Please wait...</title> <script><!-- Contenu de assets/zip.min.js --></script> </head> <body> <p>Please wait...</p> <!--
Données ZIP
--> <script><!-- Contenu de assets/main.js --></script> </body> </html>
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
1/4 - Extraction et affichage des entrées du fichier ZIP
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
2/4 - Affichage de la page index.html
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
3/4 - Affichage de la page complète
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Code JavaScript inactif ⚠️
4/4 - Prise en charge des scripts
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Lecture de la page depuis le système de fichier ⚠️
await fetch("")
Node#textContent
windows-1252
)
contre plusieurs octets (e.g. UTF-8
)
U+FFFD
des
caractères dont le code est 0
ou est invalide (suivant l'encodage)\n
des caractères :
\r
\r\n
ASCII 7-bit
Affichage en hexadécimal des données ZIP lues sous forme de texte
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
UTF-8
:
windows-1252
:
Comparaison de l'impact des différents encodages sur 1 octet
U+FFFD
(première
colonne)Comparaison de l'impact des différents encodages sur 1 octet
Evolutions dans le template HTML
UTF-8
par windows-1252
\r
\r\n
<script>
Template du fichier HTML auto-extractible (avant)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Please wait...</title>
<script><!-- Contenu de assets/zip.min.js --></script>
</head>
<body>
<p>Please wait...</p><!--
Données ZIP
-->
<script><!-- Contenu de assets/main.js --></script>
</body>
</html>
Template du fichier HTML auto-extractible (après)
<!DOCTYPE html>
<html>
<head>
<meta charset="windows-1252">
<title>Please wait...</title>
<script><!-- Contenu de assets/zip.min.js --></script>
</head>
<body>
<p>Please wait...</p><!--
Données ZIP
-->
<script><!-- Contenu de assets/main.js --></script>
</body>
</html>
Template du fichier HTML auto-extractible (après)
<!DOCTYPE html> <html> <head> <meta charset="windows-1252"> <title>Please wait...</title> <script><!-- Contenu de assets/zip.min.js --></script> </head> <body> <p>Please wait...</p><!-- Données ZIP --> <script type="text/json">
Données de consolidation
</script> <script><!-- Contenu de assets/main.js --></script> </body> </html>
Prise en charge des données consolidées dans le template HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Prise en charge des données consolidées dans le template HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Ajout des données consolidées dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Ajout des données consolidées dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Ajout des données consolidées dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Contournement de l'appel à await fetch("")
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Contournement de l'appel à await fetch("")
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
Les ressources de la page sont décodées en windows-1252
⚠️
Correction des problèmes de type MIME des ressources externes
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
assets/main.js
DEFLATE
)chunk
)IHDR
, IDAT
,
IEND
,
tEXt
...
CRC32
) calculé à partir de
l'ensemble des données du bloc89 50 4E 47 0D 0A 1A 0A
IHDR
pour l'en-tête (13 octets)
00 00 00 0D 49 48 44 52 ...
IDAT
pour les données de l'image
IEND
pour la fin des données (12 octets)
00 00 00 00 49 45 4E 44 AE 42 60 82
tEXt
pour stocker des données textes ou binaires
xx xx xx xx 74 45 58 74 ...
Structure minimale d'un fichier PNG
Type de données | Données en hexadécimal | Obligatoire | Taille (octets) | |
---|---|---|---|---|
Signature PNG | 89 50 4E 47 0D 0A 1A 0A |
✓ | 8 |
|
Bloc d'en tête | IHDR |
00 00 00 0D 49 48 44 52 ... |
✓ | 13 |
... | ||||
Bloc de données | IDAT |
xx xx xx xx 49 44 41 54 ... |
12 + n |
|
... | ||||
Bloc de fin | IEND |
00 00 00 00 49 45 4E 44 AE 42 60 82 |
✓ | 12 |
<!--
-->
et fin du
contenu HTMLStructure du fichier PNG (avant)
Type de données | Données en hexadécimal | Obligatoire | Taille (octets) | |
---|---|---|---|---|
Signature PNG | 89 50 4E 47 0D 0A 1A 0A |
✓ | 8 |
|
Bloc d'en tête | IHDR |
00 00 00 0D 49 48 44 52 ... |
✓ | 13 |
... | ||||
Bloc de données | IDAT |
xx xx xx xx 49 44 41 54 ... |
12 + n |
|
... | ||||
Bloc de fin | IEND |
00 00 00 00 49 45 4E 44 AE 42 60 82 |
✓ | 12 |
Structure du fichier PNG (après)
Type de données | Données en hexadécimal | Obligatoire | Taille (octets) | |
---|---|---|---|---|
Signature PNG | 89 50 4E 47 0D 0A 1A 0A |
✓ | 8 |
|
Bloc d'en tête | IHDR |
00 00 00 0D 49 48 44 52 ... |
✓ | 13 |
Bloc de texte | tEXt |
xx xx xx xx 74 45 58 74 ... |
12 + n |
|
... | ||||
Bloc de données | IDAT |
xx xx xx xx 49 44 41 54 ... |
12 + n |
|
... | ||||
Bloc de texte | tEXt |
xx xx xx xx 74 45 58 74 ... |
12 + n |
|
Bloc de fin | IEND |
00 00 00 00 49 45 4E 44 AE 42 60 82 |
✓ | 12 |
Template du fichier HTML auto-extractible (avant)
<!DOCTYPE html> <html> <head> <meta charset="windows-1252"> ... </head> <body> <p>Please wait...</p><!--
Données ZIP --><script type="text/json"> Données de consolidation </script> <script><!-- Contenu de assets/main.js --></script> </body> </html>
Template du fichier HTML auto-extractible (après)
<!DOCTYPE html> <html> <head> <meta charset="windows-1252"> ... </head> <body> <p>Please wait...</p><!--
Bloc(s) IDAT
--><!-- Données ZIP --><script type="text/json"> Données de consolidation </script> <script><!-- Contenu de assets/main.js --></script> </body> </html>
Template du fichier HTML auto-extractible (après)
Signature PNG + Bloc IHDR (21 octets)
<!DOCTYPE html> <html> <head> <meta charset="windows-1252"> ... </head> <body> <p>Please wait...</p><!--
Bloc(s) IDAT
--><!-- Données ZIP --><script type="text/json"> Données de consolidation </script> <script><!-- Contenu de assets/main.js --></script> </body> </html>
Bloc IEND (12 octets)
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Encapsulation du fichier HTML/ZIP dans un fichier PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
Des noeuds textes induits par le format PNG sont visibles ⚠️
Suppression des nœuds textes induits par le format PNG
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
La page est rendue en mode quirks ⚠️
Correction du mode de rendu de la page HTML et du chargement des scripts
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
L'image principale est stockée en double dans le fichier 🤔
Réutilisation de l'image dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
project/index.html
Réutilisation de l'image dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
project/index.html
Réutilisation de l'image dans la page HTML
index.html
index.js
lib/html-template.js
lib/utils.js
lib/utils-zip.js
lib/utils-png.js
assets/main.js
project/index.html
-->
dans les données binaires ZIP ou PNG
String#replaceAll()
pour remplacer les
chemins dans les fichiers texte au lieu de s'appuyer sur une analyse syntaxique<meta>
contenant la Content
Security Policy (CSP)
Questions ? 🤔, Feedback ? 📝