Можно ли использовать запрос 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))
  };

🤔 А знаете ли вы, что...
Ruby on Rails позволяет использовать компоненты фронтенда, такие как AngularJS или React, с помощью API-режима.


304
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.