Я пытаюсь сделать запрос к методу контроллера 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))
};
Правильный тип пантомимы также application/zip
.
Верно, спасибо Макс, название метода сбивало с толку. Я обновил вопрос. Я использую zipline для сбора файлов.
Извините за беспокойство, но зачем архивировать, если это всего лишь один файл? И zip, и gzip используют алгоритм DEFLATE, но почти каждый существующий браузер может беспрепятственно обрабатывать сжатие GZIP на транспортном уровне. Просто используйте вместо этого Rack::Deflater, который не потребует от ваших пользователей бессмысленной распаковки zip-файла на их конце. thinkbot.com/blog/content-compression-with-rack-deflater
Не беспокойся. Итак, в этом примере это 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
.
Когда вы отвечаете в формате, который должен быть загружен (pdf, zip и т. д.), вы хотите использовать send_file, чтобы установить правильные заголовки ответа. Я понятия не имею, почему вы действительно хотите «рендерить» почтовый индекс, поскольку группа файлов на самом деле не является чем-то, что вы бы визуализировали с помощью представления. Я бы использовал служебный объект или что-то, что просто возвращает временный файл или дескриптор файла, который использует ваш контроллер и который выполняет фактическую работу по сбору файлов для архивирования.