{"record":{"id":"f52e99d0fd44ec54","repo":"apache/superset","slug":"zip-file-contains-multiple-file-types","errorCode":null,"errorMessage":"ZIP file contains multiple file types","messagePattern":"ZIP file contains multiple file types","errorType":"validation","errorClass":"DatabaseUploadFailed","httpStatus":422,"severity":"error","filePath":"superset/commands/database/uploaders/columnar_reader.py","lineNumber":103,"sourceCode":"        file_suffix = Path(file.filename).suffix\n        if not file_suffix:\n            raise DatabaseUploadFailed(_(\"Unexpected no file extension found\"))\n        file_suffix = file_suffix[1:]  # remove the dot\n        if file_suffix == \"zip\":\n            if not is_zipfile(file):\n                raise DatabaseUploadFailed(_(\"Not a valid ZIP file\"))\n            try:\n                with ZipFile(file) as zip_file:\n                    # guard against decompression bombs before reading entries,\n                    # mirroring the importer path\n                    try:\n                        check_is_safe_zip(zip_file)\n                    except SupersetException as ex:\n                        raise DatabaseUploadFailed(str(ex)) from ex\n                    # check if all file types are of the same extension\n                    file_suffixes = {Path(name).suffix for name in zip_file.namelist()}\n                    if len(file_suffixes) > 1:\n                        raise DatabaseUploadFailed(\n                            _(\"ZIP file contains multiple file types\")\n                        )\n                    for filename in zip_file.namelist():\n                        with zip_file.open(filename) as file_in_zip:\n                            yield BytesIO(file_in_zip.read())\n            except BadZipfile as ex:\n                raise DatabaseUploadFailed(_(\"Not a valid ZIP file\")) from ex\n        else:\n            yield file\n\n    def file_to_dataframe(self, file: FileStorage) -> pd.DataFrame:\n        \"\"\"\n        Read Columnar file into a DataFrame\n\n        :return: pandas DataFrame\n        :throws DatabaseUploadFailed: if there is an error reading the file\n        \"\"\"\n        return pd.concat(","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/commands/database/uploaders/columnar_reader.py#L85-L121","documentation":"DatabaseUploadFailed ('ZIP file contains multiple file types') raised when the set of entry-name suffixes in the uploaded ZIP has more than one distinct value. Because ColumnarReader concatenates every entry into one DataFrame, all entries must be the same type (all .parquet); a mixed archive is rejected before extraction.","triggerScenarios":"Uploading a ZIP containing e.g. 'a.parquet' plus 'manifest.csv', 'readme.txt', or '__MACOSX/._a.parquet' (which has no/other suffix); archives bundling data files with metadata or logs.","commonSituations":"macOS Finder 'Compress' adding __MACOSX resource-fork entries; users zipping an entire export folder including logs/manifests; archives shared from Windows tools adding thumbs.db-style entries.","solutions":["Re-zip only the .parquet files: zip clean.zip *.parquet from the data directory","On macOS, avoid Finder compression or run zip -d data.zip '__MACOSX/*' to strip resource-fork entries","Upload the files individually if mixing types is intentional"],"exampleFix":"# before: Finder-created archive\nunzip -l bundle.zip   # shows __MACOSX/ entries\n# after\nzip -d bundle.zip '__MACOSX/*' '*/*'  # keep only top-level .parquet entries","handlingStrategy":"validation","validationCode":"import zipfile\nfrom pathlib import Path\n\ndef zip_is_single_type(fh) -> bool:\n    fh.seek(0)\n    with zipfile.ZipFile(fh) as z:\n        suffixes = {Path(n).suffix for n in z.namelist()}\n        return len(suffixes) == 1","typeGuard":null,"tryCatchPattern":null,"preventionTips":["zip data.zip *.parquet from a clean directory","Strip __MACOSX entries: zip -d bundle.zip '__MACOSX/*'","Upload heterogeneous files individually"],"tags":["zip","file-upload","validation"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}