Jeśli zrobimy window.location = "http://MyApi.com/Pdf";, przeglądarka wykonuje otrzymanie adresu URL {X1}}. Ale jeśli chcemy ustawić authentication nagłówek prośby przed otrzymaniem adresu URL, ponieważ serwer jest serwerem odpoczynku i nie obsługuje plików cookie. Jak to zrobić?

We wszystkich przypadkach używam $.ajax, aby zadzwonić, ale tym razem muszę pokazać odpowiedź w nowym oknie. Odpowiedź to zawartość pliku PDF.

Z góry dziękuję.

15
IsmailS 14 grudzień 2011, 17:27

5 odpowiedzi

Najlepsza odpowiedź

W nowszych przeglądarkach możesz być w stanie korzystać z Blobs:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button onclick="tryit();">PDF</button>
<script>
    function tryit() {
        var win = window.open('_blank');
        downloadFile('/pdf', function(blob) {
            var url = URL.createObjectURL(blob);
            win.location = url;
        });
    }
    function downloadFile(url, success) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.setRequestHeader("Authorization", "Basic " + btoa("username:password"));
        xhr.responseType = "blob";
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                if (success) success(xhr.response);
            }
        };
        xhr.send(null);
    }

</script>
</body>
</html>

W IE poproś użytkownika:

window.navigator.msSaveOrOpenBlob(blob, 'readme.pdf');

Str.s. Możesz przetestować backend w węźle:

router.get('/pdf', function(req, res) {
  if(req.headers.authorization !== 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') return res.status(403).send('Not allowed');
  res.sendFile(path.join(__dirname, 'public', 'render.pdf'));
});
router.get('/', function(req, res) {
  res.render('index');
});
11
malix 25 luty 2016, 16:16

Myślę, że to właśnie szukasz ... lub popraw mnie, jeśli się mylę.

https://developer.mozilla.org/en/docs/setting_http_request_headers.

2
Saurabh Kumar 9 lipiec 2014, 10:05

Jeśli nie dbasz o ukrywanie się lub zaciemnianie poświadczeń użytkownika, po prostu użyj zwykłej uwierzytelniania: Użyj http://username:password@MyApi.com/ zamiast http://MyApi.com/

1
Wumms 14 grudzień 2011, 14:03

Czy musi być?

Powodem, dla którego pytam, że możesz po prostu mieć formularz post (do celu = "_ puste"), które publikuje, ale pokazuje wbudowany plik w nowym oknie. Oczywiście nie będzie to rozwiązać problemu z niestandardowymi nagłówkami, ale potem, ponieważ możesz także publikować przy użyciu jQuery.ajax - co pozwala na ustawienie własnych nagłówków - masz najlepsze z obu światów.

Oto jQuery Plugin tworzy taką formę dynamicznie w celu pobrania tego, który plik. Możesz użyć tego jako odniesienia ...

Mam nadzieję że to pomoże

1
Leon 14 grudzień 2011, 14:45

Powinieneś skonfigurować $.ajax za pomocą beforeSend. Poniżej przykładu, ale oczywiście nie wiem, czy dokładna konfiguracja będzie działać dla Ciebie bez żadnego kodu.

$.ajax( {
    url : '/model/user.json',
    dataType : 'json',
    'beforeSend' : function(xhr) {
            var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password);
            var base64 = Crypto.util.bytesToBase64(bytes);
            xhr.setRequestHeader("Authorization", "Basic " + base64);
    },
    error : function(xhr, ajaxOptions, thrownError) {
        reset();
        onError('Invalid username or password. Please try again.');
        $('#loginform #user_login').focus();
    },
    success : function(model) {
        cookies();
            ...
    }
});

Aby to pracować, potrzebujesz Crypto-JS.

-2
Pieter 14 grudzień 2011, 13:32