JavaScript: How to open a returned file via AJAX

11,041

Seems to me there's no reason to do this via AJAX. Just open the new window to get_file.pl?filename=... and let the browser handle it. If the user has a plugin capable of handling the Content-Type sent by get_file.pl, the file will display; otherwise, it should download like any other file.

function getFile(filename) {
   window.open('get_file.pl?filename=' + filename,'title');
}

jQuery('#imgID').dblclick(function() { 
   getFile('someFile.docx');
});

Edit: If you want to POST to your script, you can do it with some <form> hackery:

function getFile(filename) {
    var win = 'w' + Math.floor(Math.random() * 10000000000000);
    window.open('', win,'width=250,height=100');
    var f = $('<form></form>')
            .attr({target: win, method:'post', action: 'get_file.pl'})
            .appendTo(document.body);

    var i = $('<input>')
            .attr({type:'hidden',name:'filename',value:filename})
            .appendTo(f);

    f[0].submit();
    f.remove();
}

Of course, this is somewhat silly since it is impossible to hide your data from "prying eyes" with developer tools. If your filename really is sensitive, issue access tokens to the client, and look up the data in your sever script.

Share:
11,041
vol7ron
Author by

vol7ron

Updated on August 07, 2022

Comments

  • vol7ron
    vol7ron over 1 year

    This is similar to: How to open a file using JavaScript?

    Goal: to retrieve/open a file on an image's double click

    function getFile(filename){
       // setting mime this way is for example only
       var mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
       
       jQuery.ajax({ url      : 'get_file.pl',
                     data     : {filename:filename}, 
                     success  : function(data){
                                   var win = window.open('','title');
                                   win.document.open(mime);
                                   win.document.write(data);
                                   win.document.close();
                                }
                   });
    }
    
    jQuery('#imgID').dblclick(function(){ 
       getFile('someFile.docx');
    });
    

    I'm doing this off the top of my head, but I think the above would work for text files, but not binary. Is there a plugin that does this properly? The ideal would be to open the file in the browser (or application), rather than download, but I doubt that is a dream. If the file must be downloaded with the save/open dialog, that's fine.


    Edit:

    One piece of information that I forgot to mention is that I'd like this to be a POST request. This is partly why I was looking at AJAX to begin with. I've seen workarounds that have created forms/iframes to do something similar, but I was looking for a better handler of the returned info.