v1.0.178: fix zipIdx → zipEntry (ссылка на объект). ZIP temp entry держится до конца обработки.

This commit is contained in:
2026-06-25 10:36:23 +04:00
parent 91f22137d7
commit 9a19b10708
+17 -9
View File
@@ -305,10 +305,10 @@ function applyParseResult(entry, parsed, elapsed) {
async function addZipFile(file) { async function addZipFile(file) {
var zipEntry = { name: file.name, lastModified: file.lastModified, size: file.size, status: { kind: 'unzipping' } }; var zipEntry = { name: file.name, lastModified: file.lastModified, size: file.size, status: { kind: 'unzipping' } };
state.files.push(zipEntry); state.files.push(zipEntry);
var zipIdx = state.files.length - 1;
render(state); render(state);
try { try {
// Шаг 1: распаковать ZIP на бэкенде
var zipResp = await new Promise(function(resolve, reject) { var zipResp = await new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.open('POST', UNZIP_URL); xhr.open('POST', UNZIP_URL);
@@ -323,16 +323,17 @@ async function addZipFile(file) {
}); });
if (!zipResp.ok || !zipResp.files) throw new Error('unzip failed'); if (!zipResp.ok || !zipResp.files) throw new Error('unzip failed');
// Убрать временную строку ZIP // Шаг 2: обработать каждый файл из архива
state.files.splice(zipIdx, 1); // Временная строка ZIP остаётся в таблице — обновляем её статус
render(state); var total = zipResp.files.length;
for (var zi = 0; zi < total; zi++) {
// Каждый файл из архива — через addRegularFile (единый путь)
for (var zi = 0; zi < zipResp.files.length; zi++) {
var zf = zipResp.files[zi]; var zf = zipResp.files[zi];
zipEntry.status = { kind: 'unzipping' }; // обновляем статус
render(state);
if (zf.error) continue; if (zf.error) continue;
// base64 → Blob → File // base64 → File → addRegularFile (единый путь)
var byteStr = atob(zf.data_b64); var byteStr = atob(zf.data_b64);
var bytes = new Uint8Array(byteStr.length); var bytes = new Uint8Array(byteStr.length);
for (var b = 0; b < byteStr.length; b++) bytes[b] = byteStr.charCodeAt(b); for (var b = 0; b < byteStr.length; b++) bytes[b] = byteStr.charCodeAt(b);
@@ -341,8 +342,15 @@ async function addZipFile(file) {
await addRegularFile(extractedFile); await addRegularFile(extractedFile);
} }
// Шаг 3: убрать временную строку ZIP (только после успешной обработки всех файлов)
var zipPos = state.files.indexOf(zipEntry);
if (zipPos >= 0) state.files.splice(zipPos, 1);
render(state);
} catch(ze) { } catch(ze) {
state.files[zipIdx].status = { kind: 'error', text: 'ZIP: ' + ze.message }; // Ошибка — показать на строке ZIP (zipEntry всё ещё в state.files)
zipEntry.status = { kind: 'error', text: 'ZIP: ' + ze.message };
render(state); render(state);
} }
} }