Jump to content

jquery $.ajax Data URI scheme


common
Go to solution Solved by 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
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

Link to comment
Share on other sites

  • Solution

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!
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.