Можно ли использовать запрос axios для получения zip-файла из конечной точки Rails?

Я пытаюсь сделать запрос к методу контроллера Rails, который отвечает заархивированным файлом. Как сделать внешний запрос Axios?

Метод контроллера:

include ActionController::Streaming
include Zipline

def index
  respond_to do |format|
    format.zip do
      zipline([[@project.attached.url, "#{@project_name.parameterize}.pdf"]], "documents.zip")
    end
  end
end

Что бы я сделал, если бы использовал представление:

= link_to "Download projects", company_projects_path(@company, format: :zip)

Как будет выглядеть эквивалентный запрос axios? Это не работает:

  const handleClick = () => {
    axios
    .get(`/projects/${project.id}`, {
      headers: { 'Accept': 'application/zip' }
    })
    .catch(e => console.info(e))
  };

Когда вы отвечаете в формате, который должен быть загружен (pdf, zip и т. д.), вы хотите использовать send_file, чтобы установить правильные заголовки ответа. Я понятия не имею, почему вы действительно хотите «рендерить» почтовый индекс, поскольку группа файлов на самом деле не является чем-то, что вы бы визуализировали с помощью представления. Я бы использовал служебный объект или что-то, что просто возвращает временный файл или дескриптор файла, который использует ваш контроллер и который выполняет фактическую работу по сбору файлов для архивирования.

max 22.12.2020 17:41

Правильный тип пантомимы также application/zip.

max 22.12.2020 17:45

Верно, спасибо Макс, название метода сбивало с толку. Я обновил вопрос. Я использую zipline для сбора файлов.

Hughes 22.12.2020 17:52

Извините за беспокойство, но зачем архивировать, если это всего лишь один файл? И zip, и gzip используют алгоритм DEFLATE, но почти каждый существующий браузер может беспрепятственно обрабатывать сжатие GZIP на транспортном уровне. Просто используйте вместо этого Rack::Deflater, который не потребует от ваших пользователей бессмысленной распаковки zip-файла на их конце. thinkbot.com/blog/content-compression-with-rack-deflater

max 22.12.2020 17:59

Не беспокойся. Итак, в этом примере это 1 файл, но я бы заархивировал пару по требованию. Спасибо за ссылку, почитаю. Я решил проблему, просто используя тег привязки.

Hughes 22.12.2020 18:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я обнаружил, что это сработало для меня:

<a href = {`/projects/${project.id}.zip`} download>Download all</a>

Вместо того, чтобы использовать кнопку с запросом axios onClick, который будет передавать ей заархивированный файл — что не имеет смысла — просто создайте тег привязки, который имеет ссылку на zip-путь, чтобы загрузить его.

Как указал Макс, headers: { 'Accept': 'application/zip' } будет правильным форматом для доступа к нему, но в этом нет смысла.

Обновлено:

Оформить заказ этот ответ. Браузер выдаст ошибку Resource interpreted as Document but transferred with MIME type application/zip.

Другие вопросы по теме