#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
).