From ffce51a42fcb56cf74fe532aabb9000d1b9a104a Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Tue, 3 Feb 2026 14:04:54 +0100 Subject: [PATCH] Ignore faulty ZIP files --- app/jobs/account/data_import_job.rb | 2 +- app/models/zip_file.rb | 8 ++++++++ app/models/zip_file/reader.rb | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/jobs/account/data_import_job.rb b/app/jobs/account/data_import_job.rb index ec2877bd5..67862d4c7 100644 --- a/app/jobs/account/data_import_job.rb +++ b/app/jobs/account/data_import_job.rb @@ -2,7 +2,7 @@ class Account::DataImportJob < ApplicationJob include ActiveJob::Continuable queue_as :backend - discard_on Account::DataTransfer::RecordSet::IntegrityError + discard_on Account::DataTransfer::RecordSet::IntegrityError, ZipFile::InvalidFileError def perform(import) step :check do |step| diff --git a/app/models/zip_file.rb b/app/models/zip_file.rb index bdacc441d..dc5b7ee8d 100644 --- a/app/models/zip_file.rb +++ b/app/models/zip_file.rb @@ -1,4 +1,6 @@ class ZipFile + class InvalidFileError < StandardError; end + class << self def create_for(attachment, filename:) raise ArgumentError, "No block given" unless block_given? @@ -57,6 +59,12 @@ class ZipFile blob.update!(byte_size: writer.byte_size, checksum: writer.checksum) attachment.attach(blob) + rescue Aws::S3::MultipartUploadError => e + if e.errors.any? + raise e.errors.first + else + raise e + end end def create_for_disk(attachment, filename:) diff --git a/app/models/zip_file/reader.rb b/app/models/zip_file/reader.rb index 1b9cd3dcb..2dc563f96 100644 --- a/app/models/zip_file/reader.rb +++ b/app/models/zip_file/reader.rb @@ -2,6 +2,8 @@ class ZipFile::Reader def initialize(io) @io = io @reader = ZipKit::FileReader.read_zip_structure(io: io) + rescue ZipKit::FileReader::InvalidStructure => e + raise ZipFile::InvalidFileError, e.message end def read(file_path)