Export corrupted from old version after 2.5 and 2.6 update

After the update from 2.3 to 2.5 (and then to 2.6, but with no change), I’m getting a backend error with missing files in the exports of all projects created in 2.3 or earlier (no issue with new projects created in 2.5 or 2.6).

penpot-backend | [2025-04-28 08:38:34.851] I app.binfile.v3 - hint=“import: started”, id=“ee64c428-36a3-8084-8006-1a272c987252”
penpot-backend | [2025-04-28 08:38:59.116] I app.binfile.v3 - hint=“import: terminated”, id=“ee64c428-36a3-8084-8006-1a272c987252”, elapsed=“24.267458718s”, error?=true
penpot-frontend | 172.18.0.13 - - [28/Apr/2025:08:38:59 +0000] “POST /api/rpc/command/import-binfile HTTP/1.0” 200 672 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36”
nginx | 172.18.0.1 - - [28/Apr/2025:08:38:59 +0000] “POST /api/rpc/command/import-binfile HTTP/1.1” 200 684 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36”
penpot-backend | [2025-04-28 08:38:59.138] E app.http.sse - hint=“unexpected error on processing sse response”
penpot-backend | SUMMARY:
penpot-backend | → java.util.concurrent.ExecutionException: clojure.lang.ExceptionInfo: the penpot file seems corrupt, missing underlying zip entry {:type :validation, :code :inconsistent… (CompletableFuture.java:396)
penpot-backend | → clojure.lang.ExceptionInfo: the penpot file seems corrupt, missing underlying zip entry (v3.clj:399)
penpot-backend | DETAIL:
penpot-backend | → java.util.concurrent.ExecutionException: clojure.lang.ExceptionInfo: the penpot file seems corrupt, missing underlying zip entry {:type :validation, :code :inconsistent… (CompletableFuture.java:396)
penpot-backend | at: java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
penpot-backend | java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073)
penpot-backend | promesa.impl$eval19292$fn__19293.invoke(impl.cljc:306)
penpot-backend | promesa.protocols$eval13248$fn__13249$G__13239__13258.invoke(protocols.cljc:101)
penpot-backend | promesa.exec$invoke_BANG_.invokeStatic(exec.cljc:393)
penpot-backend | promesa.exec$invoke_BANG_.invoke(exec.cljc:388)
penpot-backend | app.rpc.commands.binfile$import_binfile.invokeStatic(binfile.clj:114)
penpot-backend | app.rpc.commands.binfile$import_binfile.invoke(binfile.clj:96)
penpot-backend | clojure.core$partial$fn__5929.invoke(core.clj:2647)
penpot-backend | app.http.sse$response$fn__54565$fn__54566.invoke(sse.clj:62)
penpot-backend | yetti.response$stream_body$reify__34265.write_body_to_stream(response.clj:53)
penpot-backend | yetti.response$write_response_BANG_.invokeStatic(response.clj:69)
penpot-backend | yetti.response$write_response_BANG_.invoke(response.clj:55)
penpot-backend | yetti.adapter$handle_response.invokeStatic(adapter.clj:78)
penpot-backend | yetti.adapter$handle_response.invoke(adapter.clj:72)
penpot-backend | yetti.adapter$dispatch_fn$fn__51905.invoke(adapter.clj:98)
penpot-backend | yetti.adapter$create_handler$reify__51916$fn__51917.invoke(adapter.clj:121)
penpot-backend | clojure.lang.AFn.run(AFn.java:22)
penpot-backend | java.util.concurrent.ThreadPerTaskExecutor$TaskRunner.run(ThreadPerTaskExecutor.java:314)
penpot-backend | java.lang.VirtualThread.run(VirtualThread.java:309)
penpot-backend |
penpot-backend | → clojure.lang.ExceptionInfo: the penpot file seems corrupt, missing underlying zip entry (v3.clj:399)
penpot-backend | at: app.binfile.v3$get_zip_entry.invokeStatic(v3.clj:399)
penpot-backend | app.binfile.v3$get_zip_entry.invoke(v3.clj:395)
penpot-backend | app.binfile.v3$import_storage_objects.invokeStatic(v3.clj:784)
penpot-backend | app.binfile.v3$import_storage_objects.invoke(v3.clj:762)
penpot-backend | app.binfile.v3$import_files$fn__54192.invoke(v3.clj:915)
penpot-backend | clojure.lang.AFn.applyToHelper(AFn.java:154)
penpot-backend | clojure.lang.AFn.applyTo(AFn.java:144)
penpot-backend | clojure.core$apply.invokeStatic(core.clj:669)
penpot-backend | clojure.core$apply.invoke(core.clj:662)
penpot-backend | app.db$tx_run_BANG_$fn__19017.invoke(db.clj:550)
penpot-backend | next.jdbc.transaction$transact_STAR_.invokeStatic(transaction.clj:72)
penpot-backend | next.jdbc.transaction$transact_STAR_.invoke(transaction.clj:51)
penpot-backend | next.jdbc.transaction$eval18681$fn__18682.invoke(transaction.clj:152)
penpot-backend | next.jdbc.protocols$eval16973$fn__16974$G__16964__16983.invoke(protocols.clj:58)
penpot-backend | next.jdbc$transact.invokeStatic(jdbc.clj:424)
penpot-backend | next.jdbc$transact.invoke(jdbc.clj:416)
penpot-backend | app.db$transact_BANG_.invokeStatic(db.clj:534)
penpot-backend | app.db$transact_BANG_.invoke(db.clj:529)
penpot-backend | app.db$tx_run_BANG_.invokeStatic(db.clj:545)
penpot-backend | app.db$tx_run_BANG_.doInvoke(db.clj:536)
penpot-backend | clojure.lang.RestFn.invoke(RestFn.java:428)
penpot-backend | app.binfile.v3$import_files.invokeStatic(v3.clj:901)
penpot-backend | app.binfile.v3$import_files.invoke(v3.clj:857)
penpot-backend | app.binfile.v3$import_files_BANG_.invokeStatic(v3.clj:1000)
penpot-backend | app.binfile.v3$import_files_BANG_.invoke(v3.clj:981)
penpot-backend | clojure.core$partial$fn__5927.invoke(core.clj:2640)
penpot-backend | promesa.exec$wrap_bindings$fn__13413.invoke(exec.cljc:192)
penpot-backend | promesa.util.Supplier.get(util.cljc:27)
penpot-backend | java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
penpot-backend | java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
penpot-backend | java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
penpot-backend | java.lang.Thread.run(Thread.java:1583)
penpot-backend | dt: {:type :validation,
penpot-backend | :code :inconsistent-penpot-file,
penpot-backend | :hint “the penpot file seems corrupt, missing underlying zip entry”,
penpot-backend | :path “objects/b7a66302-e0bd-4807-9f87-da6d8262fa88.png”}