v1.0.178: fix zipIdx → zipEntry (ссылка на объект). ZIP temp entry держится до конца обработки.
This commit is contained in:
+16
-8
@@ -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 остаётся в таблице — обновляем её статус
|
||||||
|
var total = zipResp.files.length;
|
||||||
|
for (var zi = 0; zi < total; zi++) {
|
||||||
|
var zf = zipResp.files[zi];
|
||||||
|
zipEntry.status = { kind: 'unzipping' }; // обновляем статус
|
||||||
render(state);
|
render(state);
|
||||||
|
|
||||||
// Каждый файл из архива — через addRegularFile (единый путь)
|
|
||||||
for (var zi = 0; zi < zipResp.files.length; zi++) {
|
|
||||||
var zf = zipResp.files[zi];
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user