Jump to content

jquery $.ajax Data URI scheme


common

Recommended Posts

Hi Everyone,

 

I am struggling with a pdf.

 

On our server I get the pdf as a byte array from the database, which I then build up in a StreamingOutput object and return as a pdf file. This is done using java using JAX-RS service.

Now when I open the path/link in my browser(chrome/firefox) the pdf opens in the browser. So this means my backend is working.

 

On my webapp I want to use $.ajax to download the pdf and view it in an Iframe or embed it in an <embed> or <object> tag. I need to do this as the service call is actually under username and password, and we do not create a session between the browser and the server - there is a long explanation for this.

 

I saw the option to use http://[username]:[password]@www.myserver.com/... but this was dropped by most browsers. This is why I am trying ajax.

 

Now in my ajax call I do receive the pdf in the success function as: 

%PDF-1.4....

This open the browser's pdfviewer correctly and every thing, but the pdf only returns blank pages.

The Base64 is a java object that I found on the internet. But I have tried it without the base64 but still now luck.

Here is my success function from my ajax call. 

success: function(data, status, xhr) {
                var pdfText = Base64.encode(xhr.responseText);

                var url = "data:application/pdf;base64," + escape(pdfText);

                var html = '<embed width=100% height=600'
                        + ' type="application/pdf"'
                        + ' src="' + url + '">'
                        + '</embed>';

                $("div.inner").html("");
                $("div.inner").append(html);
            },

Can anyone help me?

 

Kind regards

 

Link to comment
https://forums.phpfreaks.com/topic/289734-jquery-ajax-data-uri-scheme/
Share on other sites

The Base64 is a java object that I found on the internet.

That's right: Java. Java and Javascript are two completely different things.

 

Inline content sucks. Can't you just use a time-limited URL?

1. JS: Do the POST but now you only get a temporary token

2. Java: Store that token in the database along with a reference to the PDF - this is a good opportunity to log views too

3. JS: Construct a specific URL containing that token ("/path/to/service?token=123abc") and embed it

4. Java: Take that token, check that it's still valid, and if so output the PDF

Hi

 

Sorry, meant javascript - The Base64 is a java object that I found on the internet

 

javascript The token is not a bad idea, but got it to work using

    var xhr = new XMLHttpRequest();    
    xhr.open(method, url, true);
    xhr.responseType = 'blob';
    xhr.setRequestHeader('Authorization', 'Basic ' + auth);
    xhr.onload = function(e) {
        if (this.status === 200) {
            var blob = new Blob([this.response], {type: this.response.type});
            var blobURL = URL.createObjectURL(blob);
            blobCallBack(blobURL);
        }
    };
    xhr.send();

blobCallback is a function I provide where I do my inline content: src=blobURL . And that works perfectly.

 
Thanks for your help!

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.