usebruno/bruno · error · Error
ZIP file does not exist
Error message
ZIP file does not exist
What it means
renderer:import-collection-zip validates zipFilePath with fs.existsSync before extraction. Throws before creating the temp directory, so no partial state is left behind.
Source
Thrown at packages/bruno-electron/src/ipc/collection.js:2672
const zip = new AdmZip(zipFilePath);
const entries = zip.getEntries().map((e) => e.entryName);
return entries.some(
(name) =>
name === 'bruno.json'
|| name === 'opencollection.yml'
|| /^[^/]+\/bruno\.json$/.test(name)
|| /^[^/]+\/opencollection\.yml$/.test(name)
);
} catch {
return false;
}
});
ipcMain.handle('renderer:import-collection-zip', async (event, zipFilePath, collectionLocation) => {
try {
if (!fs.existsSync(zipFilePath)) {
throw new Error('ZIP file does not exist');
}
if (!collectionLocation || !fs.existsSync(collectionLocation)) {
throw new Error('Collection location does not exist');
}
const tempDir = path.join(os.tmpdir(), `bruno_zip_import_${Date.now()}`);
await fsExtra.ensureDir(tempDir);
// Validates that no symlinks point outside the base directory
const validateNoExternalSymlinks = (dir, baseDir) => {
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
const stat = fs.lstatSync(fullPath);
if (stat.isSymbolicLink()) {
const linkTarget = fs.readlinkSync(fullPath);View on GitHub (pinned to 9bdd81c7bd)
Solutions
- Verify the zip exists at the moment of import (re-stat just before calling).
- Re-prompt the user to pick the file if it has been removed.
- Copy the selected zip into a process-owned temp location immediately on selection.
Defensive patterns
Strategy: validation
Validate before calling
const fs = require('fs');
if (!zipFilePath || !fs.existsSync(zipFilePath)) {
throw new Error('ZIP file does not exist');
} Try / catch
try {
await ipcRenderer.invoke('renderer:import-collection-zip', zipFilePath, collectionLocation);
} catch (err) {
if (/ZIP file does not exist/.test(err.message)) {
// re-prompt the user to pick the zip
} else {
throw err;
}
} Prevention
- Copy the selected zip into a process-owned temp location immediately on selection.
- Re-stat the file just before invoking; tmp cleanup can reap it between selection and import.
When it happens
Trigger: Calling renderer:import-collection-zip with a zipFilePath that does not exist on disk at call time.
Common situations: Temp file selected in a dialog was cleaned by the OS between selection and import; network drive hiccup; path computed from stale state; user moved/deleted the zip after picking it.
Related errors
- Collection location does not exist
- Collection path does not exist
- No files selected
- Invalid file type: ${file.name}. Only JSON files are support
- ${request.filename} is not a valid filename
AI-assisted analysis of usebruno/bruno@9bdd81c7bd (2026-08-13).
Data as JSON: /api/errors/b2e715944bb4afd7.
Report an issue: GitHub.