Skip to content

Commit 1141307

Browse files
committed
Fix handling spaces in file names being URL encoded
1 parent 12219df commit 1141307

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

src/lib/processes/load-model/ZipGLTFLoader.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,46 @@ export class ZipGLTFLoader {
3939
const binNameOnly = bin_filename.split('/').pop()
4040
gltf_json.buffers[0].uri = binNameOnly
4141
}
42-
// Map all relevant files by filename only
42+
// Map all relevant files by filename only (case-insensitive, handle spaces)
4343
const fileMap: Record<string, Uint8Array> = {}
4444
const filePromises = Object.keys(zip.files).map(async (filename) => {
4545
const file = zip.files[filename]
4646
if (!file.dir) {
4747
const nameOnly = filename.split('/').pop() ?? filename
4848
if (/\.(bin|gltf|png|jpg|jpeg|webp)$/i.test(nameOnly)) {
49-
fileMap[nameOnly] = new Uint8Array(await file.async('arraybuffer'))
49+
// Map by original, lowercased, and decoded name
50+
const buffer = new Uint8Array(await file.async('arraybuffer'))
51+
fileMap[nameOnly] = buffer
52+
fileMap[nameOnly.toLowerCase()] = buffer
53+
try {
54+
const decoded = decodeURIComponent(nameOnly)
55+
fileMap[decoded] = buffer
56+
fileMap[decoded.toLowerCase()] = buffer
57+
} catch {}
5058
}
5159
}
5260
})
5361
await Promise.all(filePromises)
5462
// Patch loader to use in-memory blobs for all referenced files
5563
this.loader.manager.setURLModifier((url: string) => {
5664
const cleanUrl = url.split(/[?#]/)[0]
57-
const nameOnly = cleanUrl.split('/').pop() ?? cleanUrl
58-
if (fileMap[nameOnly]) {
65+
let nameOnly = cleanUrl.split('/').pop() ?? cleanUrl
66+
// Try original, lowercased, and decoded
67+
let buffer = fileMap[nameOnly]
68+
if (!buffer) buffer = fileMap[nameOnly.toLowerCase()]
69+
if (!buffer) {
70+
try {
71+
const decoded = decodeURIComponent(nameOnly)
72+
buffer = fileMap[decoded] || fileMap[decoded.toLowerCase()]
73+
} catch {}
74+
}
75+
if (buffer) {
5976
let mime = 'application/octet-stream'
6077
if (/\.png$/i.test(nameOnly)) mime = 'image/png'
6178
else if (/\.jpe?g$/i.test(nameOnly)) mime = 'image/jpeg'
6279
else if (/\.webp$/i.test(nameOnly)) mime = 'image/webp'
6380
else if (/\.gltf$/i.test(nameOnly)) mime = 'application/json'
64-
const blob = new Blob([fileMap[nameOnly]], { type: mime })
81+
const blob = new Blob([buffer], { type: mime })
6582
return URL.createObjectURL(blob)
6683
}
6784
return url

0 commit comments

Comments
 (0)