Подтвердить что ты не робот

Проблемы с загрузкой PDF в Chrome IOS

Мы получаем следующее сообщение от Chrome при загрузке (или попытке загрузки) PDF файла в нашем мобильном веб-приложении.

"Предупреждение: что-то не так прямо здесь!... Сайт, к которому вы пытаетесь получить доступ, действует странно, и Chrome не может проверить правильность URL-адреса."

Это отлично работает в Safari и, по сути, мы это делаем.

  • При загрузке сделайте вызов, чтобы проверить, что документ, который мы хотим показать, в порядке.
    • если документ не соответствует сообщению пользователя, а затем закрывает вкладку
  • Направьте вкладку, чтобы перейти к адресу, который загружает PDF.

Без размещения слишком большого кода Javascript выглядит примерно так:

DoRequest ("print_report",
           "VALIDATE",
           mycallback);

function mycallback (data,error) {

    var h_href = "";
    var h_widget = "";

    if(error == true) {
        window.close(); 
        return;
    }    

    h_href = GenerateHREF( "print_report", "PRINT" );

    window.location.href = h_href;        
}

URL-адрес, предоставленный GenerateHREF, предназначен для одного исходного сайта и относится к оригиналу. тип mime устанавливается в application/pdf. Содержимое-расположение установлено в строку. Я также попытался настроить заголовок размера содержимого, но он, похоже, не имеет никакого эффекта.

Content-Disposition: attachment; filename="pp66.26.pdf"
Content-Length: 31706
Content-Type: application/pdf

Мне что-то не хватает... только что?

4b9b3361

Ответ 1

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

    function getAsyncBase64(fileName, callBack){
        var xhr = new XMLHttpRequest();
        xhr.open('GET', fileName, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function (e) {
        if (this.status == 200) {
            var uInt8Array = new Uint8Array(this.response || this.responseText);
            var i = uInt8Array.length;
            var binaryString = new Array(i);
            while (i--) {
                binaryString[i] = String.fromCharCode(uInt8Array[i]);
            }
            var dataBinary = binaryString.join('');
            var data64 = window.btoa(dataBinary);
            callback(data64);                
        }
        xhr.send();
    };
    function callback(base64){
        window.open(base64, "_blank");
        //or
        iframe.src = "data:application/pdf;base64,"+ base64;
    };

    getAsyncBase64(url,callback);

Ответ 2

Если это проблема с всплывающим/загружаемым файлом, вы можете показать его с помощью iframe?

<iframe src="downloads/report.pdf"></iframe>

Ответ 3

Я также думаю, что всплывающее поведение, вероятно, является высоким в списке подозреваемых (в частности, window.close(); строка кажется довольно подозрительной, особенно если всплывающее окно заблокировано пользователем).

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

Content-Disposition: attachment; filename="pp66.26.pdf"
Content-Length: 31706
Content-Type: applicaton/octet-stream

или вы можете попытаться заставить все pdf файлы в определенной папке принудительно загрузить файл через .htaccess, а затем просто привязать к ним через location.href вы используете:

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>