Как скачать файл, когда функция jjaso вызывается из javascript вместо навигации по URL? - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть страница, где несколько кнопок обрабатывают различные функции, такие как отправка смс (через API), отправка файла по электронной почте или загрузка файла PDF.Действия кнопок не используют формы, но используют ajax-запросы через javascript.

Я использовал для создания pdf-файла с использованием javascript (jspdf), но написал код, который генерирует pdf-файл python на сервере.Теперь мне нужно разрешить загрузку при нажатии кнопки.

Фрагмент кода сервера:

with NamedTemporaryFile(mode='w+b') as temp:
    from django.http import FileResponse
    doc = SimpleDocTemplate(temp.name, pagesize=A4, rightMargin=20, leftMargin=20, topMargin=20, bottomMargin=20, allowSplitting=1, title="Prescription", author="MyOPIP.com")
    doc.build(elements)
    print(f'Generated {temp.name}')
    return FileResponse(open(temp.name, 'rb'), content_type='application/pdf')

Предполагается, что приведенный выше код загружает файл PDF, если он вызывается путем перехода по URL-адресу.

Со своей стороны javascript я попытался определить, что я получаю:

$.ajax({
    url: `/clinic/${cliniclabel}/prescription/download/patient/${patient_id}`,
    dataType: "html",
    data: data,
    type: 'POST',
    success: function (data) {
        console.log("Received data from server..type is ", typeof(data))
        console.log(data)
    }
});

И я получаю:

Received data from server..type is  string
%PDF-1.4
%���� ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 5 0 R
>>
endobj
2 0 obj....

Очевидно, django отправляет это как файлпоток.Как я могу получить файл, загруженный пользователю, когда ответ обрабатывается JavaScript?

1 Ответ

0 голосов
/ 17 ноября 2018

Невозможно сделать это через Ajax, потому что JavaScript не может сохранять файлы напрямую на компьютер пользователя (из соображений безопасности).

При этом обходным путем будет установка «src»привязать тег к URL для загрузки файла и вызвать щелчок по нему.

Примечание: Вам придется изменить метод функции с POST на GET

  • Измените "кнопку" на ссылку "a" и добавьте src="#" в html.
  • Добавьте нг-щелчок, чтобы вызвать функцию JS
  • В JS не вызывайте event.PreventDefault();, а затем обновляйте «src» тега «a».
  • Как только функция завершится, она вызовет обычный щелчок по кнопкеВ любом случае, тег <a> (с обновленным исходным кодом)

Я не проверял вышеизложенное;поэтому, если это не сработает, попробуйте выполнить следующее:

  • Оставьте кнопку как есть
  • Добавьте новый скрытый тег <a> с помощью src="#"
  • В функции JS обновите src тега <a> и нажмите триггер на элементе.

Прокомментируйте здесь, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...