Создание файла, защищенного той же системой, что и конечная точка, доступной в приложении Ember - PullRequest
0 голосов
/ 21 июня 2019

Приложение ember запускается поверх API рельсов.

Для аутентификации. Используется заголовок токена (со стороны сервера devise).

У меня есть действие index, которое возвращает CSV, когдапросьба добавить .csv к URL:

        respond_to do |format|
          format.json {json_response @custormer_info_requests.page(@page).per(@size)}
          format.csv {send_data @custormer_info_requests.to_csv, filename: "demandes.csv"}
        end

Проблема в том, что прямая ссылка, подобная этой: <a href='/marketadmin_api/v1/customer_info_requests.csv?partner_id={{partner.id}}'>File</a>

Сбой с 401, потому что нет заголовка аутентификации.

Как разрешить пользователям загружать защищенные файлы?

1 Ответ

0 голосов
/ 25 июня 2019

У вас есть несколько вариантов:

  1. Получить файл с помощью javascript (вы можете прочитать, как загрузить двоичные данные с помощью jquery здесь ), а затем использовать FileSaver для запуска диалога «загрузки».Возможно, вы захотите заменить ссылку на кнопку и показать какой-нибудь спиннер во время загрузки файла.Вы также можете предварительно извлечь его, если файл не слишком большой, и вы на 80% уверены, что пользователь захочет его скачать.

    1a.Если во внешнем интерфейсе уже есть данные, вы можете создать csv на клиенте (например, используя papaparse или эту библиотеку ) и использовать FileSaver, чтобы позволить пользователю сохранить их.Это избавит вас от лишних запросов.Чтобы сохранить файл из csv-строки: saveAs(new Blob([csvString], { type: 'text/csv;charset=utf-8;' }), 'file-name.csv');

    1b.Извлеките json, преобразуйте его в csv на клиенте и используйте FileSaver для его сохранения.

  2. Добавьте аутентификационный токен в качестве параметра get для ссылки и научите бэкэнд понять его

  <a href='/marketadmin_api/v1/customer_info_requests.csv?partner_id={{partner.id}}&auth={{token}}'>File</a>
...