Nginx "X-Accel-Redirect" предоставляет PDF в виде открытого текста - PullRequest
0 голосов
/ 26 сентября 2018

У меня проблема с отображением файла PDF в браузере с помощью X-Accel-Redirect.Ссылка на URL-адрес файла напрямую из общедоступного местоположения Nginx работает хорошо.Тем не менее, ограничение доступа к расположению путем добавления «внутренних» и вызова X-Accel-Redirect из Django HttpResponse() отправляет файл PDF в виде открытого текста, как и любой другой статический файл (css, js, html).

Python Response

response = HttpResponse()
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename=example.pdf'
response['X-Accel-Redirect'] = '/media/file-pdf/example.pdf'
return response

Nginx Location

location /media/{
    internal;
    alias /var/www/media/;
    default_type application/pdf;
}

Javascript

$.ajax({
        url: http://www.example.com/pdf-api/,
        type: 'GET',
        success: function(data) {
            window.open(data);
            console.log(data);
        },
});

Образец pdf в виде полученного текста (как видно на консоли браузера)

%PDF-1.3
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>> 
  /Type /Page
>>
endobj
4 0 obj
<<
/PageMode /UseNone /Pages 6 0 R /Type /Catalog
>>
endobj
5 0 obj
<<
/Author (anonymous) /CreationDate (D:20180925202407-08'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20180925202407-08'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
  /Subject (unspecified) /Title (untitled) /Trapped /False
>>
endobj
6 0 obj
<<
/Count 1 /Kids [ 3 0 R ] /Type /Pages
>>
endobj
7 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 856
>>

Мой вопрос: как правильно подавать ограниченный pdf (или любой файл) пользователям, использующим Python+ Джанго + Нгинкс?Или я должен преобразовать двоичные данные, отправленные в PDF на конце браузера?

1 Ответ

0 голосов
/ 26 сентября 2018

Я думаю, что вы делаете правильно.Браузеры не могут просто «отображать» PDF-файл как таковой.Я полагаю, что вы имеете в виду автоматическое отображение PDF-файлов Chrome при их открытии?На самом деле они запускаются загрузками на веб-интерфейсе.

После того, как ваш AJAX-вызов получает PDF от бэкэнда, у вас есть несколько вариантов здесь:

  1. Вставить PDFпросмотра в вашем пользовательском интерфейсе и передайте URL-адрес PDF в средство просмотра (например, ViewerJS или pdf.js ).

  2. Создать Blob с данными и прикрепите их в качестве ссылки к скрытому тегу привязки и используйте javascript для принудительного действия click() на него, чтобы инициировать загрузку.Вы можете найти вдохновение здесь

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