Когда я загружаю файлы Excel, сохраняются странные файлы

#ruby-on-rails #ruby #rubyzip

Вопрос:

Я хочу загрузить загруженные файлы, такие как .zip,. xlsm, xlsx, pdf… … и т. Д., Которые были загружены, я хочу в конечном итоге сжать их в zip-файл для загрузки.

Однако, если загруженные файлы не будут заархивированы, они будут загружены со странными файлами, хранящимися в них.

В этом случае .xlsm

введите описание изображения здесь

исходный код

 class DownloadZipsController < ::ApplicationController

      def index
        file_name = "#{Time.current.strftime("%Y%m%d_%H%M%S")}.zip"
        zip_file = Tempfile.new(file_name)

        Zip.unicode_names = true
        Zip::OutputStream.open(zip_file.path) do |zip|
          params[:product_ids].each do |product_id|
            product = Product.find(product_id)
            zip.put_next_entry("output.zip")
            zip.print Net::HTTP.get URI.parse(product.submit_zip_file.url)
          end
        end

        send_file zip_file.path,
              type: "application/zip",
              disposition: "attachment",
              filename: file_name

        zip_file.close

      rescue => e
        logger.debug e.backtrace
        redirect_to request.referer, alert: e.message
      end

    end
 

Загруженные файлы хранятся в AWS S3.

Есть ли какое-либо решение этой проблемы?

Комментарии:

1. Вам действительно следует перенести этот код из контроллера в отдельный сервисный объект, который можно протестировать изолированно.

Ответ №1:

Документы Office, такие как .xlsm , .xlsx , .docx , и другие, на самом деле являются zip-файлами, содержащими документ в виде xml-файла плюс дополнительные ресурсы.

Дерево файлов, показанное на скриншоте, показывает содержимое одного такого документа, если вы интерпретируете его как zip-файл и распаковываете.

Похоже, что где-то в вашем коде вы определили файл документа как zip-файл и интерпретировали его как таковой, в результате чего его содержимое было распаковано.

Это не видно из кода, который вы опубликовали, однако, поэтому я бы предположил, что у вас есть какая-то дополнительная обработка zip-файлов где-то в другом месте (например, функция загрузки существующих файлов, которые затем могут быть отправлены в браузер с неправильным типом контента, т. е. в качестве application/zip , а не application/vnd.ms-excel.sheet.macroEnabled.12 ).