Skip to content

Instantly share code, notes, and snippets.

@DavidMah
Created August 30, 2012 17:03
Show Gist options
  • Select an option

  • Save DavidMah/3533415 to your computer and use it in GitHub Desktop.

Select an option

Save DavidMah/3533415 to your computer and use it in GitHub Desktop.
File Download requests using jquery/POST request with psuedo ajax
// Takes a URL, param name, and data string
// Sends to the server.. The server can respond with binary data to download
jQuery.download = function(url, key, data){
// Build a form
var form = $('<form></form>').attr('action', url).attr('method', 'post');
// Add the one key/value
form.append($("<input></input>").attr('type', 'hidden').attr('name', key).attr('value', data));
//send request
form.appendTo('body').submit().remove();
};
# A Tidbit of sinatra code to respond
# Assume url is a set variable
# Assume 'key' is the key of the value used in the javascript
post url do
data = params[:key]
puts request.body.read
headers['Content-Type'] = "application/octet-stream"
body(data)
end
@MauricioTRS

Copy link
Copy Markdown
function download(url, data){

    var form = $('<form></form>').attr('action', url).attr('method', 'post');

    Object.keys(data).forEach(function(key){
        var value = data[key];

        if(value instanceof Array) {
            value.forEach(function (v) {
                form.append($("<input></input>").attr('type', 'hidden').attr('name', key).attr('value', v));
            });
        } else {
            form.append($("<input></input>").attr('type', 'hidden').attr('name', key).attr('value', value));
        }

    });    

    //send request
    form.appendTo('body').submit().remove();
};

@natan88

natan88 commented Jan 7, 2017

Copy link
Copy Markdown

I modified the line

var form = $('<form></form>').attr('action', url).attr('method', 'post');
var form = $('<form></form>').attr('action', url).attr('method', 'post').attr('target', '_blank');

I use the angle with socket.io and the way the connection was interrupted, that way it was perfect for my case.

Thanks

@marcozs84

Copy link
Copy Markdown

Just amazing, thank you very much!

@milesrichardson

Copy link
Copy Markdown

David Mah!! Long time no speak. :) This is a great trick, just found it on google and used it.

@martinxusz

Copy link
Copy Markdown

really helps , thanks a ton :)

@Marton6

Marton6 commented Jan 14, 2018

Copy link
Copy Markdown

awesome, thanks

@codeyash

Copy link
Copy Markdown

6 years..and still working like magic :)

@jcleroi

jcleroi commented Jun 30, 2018

Copy link
Copy Markdown

Perfect

@AaronActu

AaronActu commented Jun 30, 2018

Copy link
Copy Markdown

πŸ₯‡ Thanks a lot @DavidMah πŸ‘

Even if it's not working for my part 😞

Are the key and data attributes essential if I remove the "input" line (line 8) ? It only redirects me.

function download(url){
    var form = $('<form></form>').attr('action', url).attr('method', 'post').attr('target', '_blank');
    form.appendTo('body').submit().remove();
}

EDIT: Sorry, I think it is my fault. Not sure yet
EDIT2: Okay, My problem is now solved Thanks again πŸ˜„

@rgaufman

rgaufman commented Jul 4, 2018

Copy link
Copy Markdown

Here is a more readable coffeescript version :)

attrs = { action: '/target-path.csv', method: 'post', target: '_blank' }
params = { key1: 'value1', key2: 'value2' }
form = $('<form></form>').attr(k, v) for k, v of attrs
form.append $('<input></input>').attr('type', 'hidden').attr('name', k).attr('value', v) for k, v of params
form.appendTo('body').submit().remove()

@tihoho

tihoho commented Aug 9, 2018

Copy link
Copy Markdown

Server returned error #400.

@dsenthilkumar95

Copy link
Copy Markdown

I have more than two files to be downloaded at the page. If I click at one file and click the next one before the first download is completed only second file gets downloaded and first one is failing. Please let me know if someone of you have resolved this issue.

@ProjectLinde37

Copy link
Copy Markdown

Just found today a very simple solution
window.location.href = 'urltofile';

@tharinduEranga

Copy link
Copy Markdown

Thanks, man, you saved the day!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment