Content-Disposition: вложение не запускает диалог загрузки

я столкнулся с неожиданным поведением при попытке создать функциональность загрузки файлов на моем сервере NodeJS. У меня есть REST (express) API, который вызывает некоторую функцию экспорта данных, которая создает CSV-файл на сервере и использует res.download('path/to/file') для запуска загрузки. Заголовки ответов включают

Content-Disposition:attachment; filename="indicators.csv"
Content-Length:30125
Content-Type:text/csv; charset=UTF-8

таким образом, все, кажется, в порядке.

дело в том, что я получаю ответ от сервера в виде обычного текста. В ответе есть все данные CSV-файла содержит, но не запускает диалоговое окно загрузки файла браузера, как я намеревался. Я пробовал как на Chrome, так и на FF. Проблема сохраняется в обоих.

какие идеи?

обновление

мне удалось заставить его работать, создав фиктивную форму и используя ее действие submit для вызова AJAX. Но это грязный хак, и я все еще ищу более элегантное решение.

3 ответов


заголовки не проблема. Вопрос в том, что вы запрашиваете URL-адрес загрузки через ajax вызов, который не будет вызывать диалоговое окно загрузки браузера. Ваши варианты сводятся к следующему:

  1. используйте форму, отправленную на url-адрес загрузки. Вместо того, чтобы иметь видимую форму, с которой пользователь должен взаимодействовать, создайте форму с JavaScript и отправьте его программно, вызвав form.submit -загрузка файла дескриптора из ajax пост

  2. точка window.location к url загрузки. Вы можете сделать это в текущем окне - загрузить файл с помощью ajax-запроса , или в новую - res.download () не работает в моем случае


вы можете попробовать использовать другой тип контента, так что он не будет открыт в качестве текстового файла в браузере:

Content-Type:application/ms-excel; charset=UTF-8

Другой альтернативой может быть использование application / octet-stream в качестве MIME-типа для определения его как загружаемого файла без лучшего описания.

Content-Type:application/octet-stream; charset=UTF-8

вопрос похож на этот

показать диалоговое окно "Сохранить как" при загрузке файла из Iframe через PHP

основная идея-это второй вариант, который роман описал выше, но этот использует iframe для его достижения.