POST to server, receive PDF, deliver to user w/ jQuery

前端 未结 7 1444
逝去的感伤
逝去的感伤 2020-11-27 04:01

I have a link that the user clicks to get a PDF. In jQuery, I create a POST ajax call to the server to get the PDF. The PDF comes to me with the correct content headers et

相关标签:
7条回答
  • 2020-11-27 04:38

    The answer mentioning "jQuery Plugin for Requesting Ajax-like File Downloads" got me headed down the right direction, but it didn't work entirely for my situation since I have a complex object and array of objects to pass in as my search criteria/filter data. I figured I'd share my code in case someone else runs into this situation too.

    $.download = function (url, data, method) {
        if (url && data) {
            //convert the data object into input HTML fields
            var inputs = '';
            var convertToInput = function (key, keyStr, obj) {
                if (typeof obj === 'undefined') {
                    return;
                } else if (typeof obj === "object") {
                    for (var innerKey in obj) {
                        if (obj.hasOwnProperty(innerKey)) {
                            var innerKeyStr = '';
                            if (keyStr === '') {
                                innerKeyStr = innerKey.toString();
                            } else {
                                innerKeyStr = keyStr + "[" + innerKey.toString() + "]";
                            }
                            convertToInput(innerKey, innerKeyStr, obj[innerKey]);
                        }
                    }
                    return;
                } else if ($.isArray(obj)) {
                    obj.forEach(function (item) {
                        convertToInput(key, keyStr + "[]", item);
                    });
                    return;
                }
    
                inputs += "<input type='hidden' name='" + keyStr + "' value='" + obj + "' />";
            };
            convertToInput(null, '', data);
    
            //send request
            jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>').appendTo('body').submit().remove();
        };
    };
    $.download('/api/search?format=csv', searchData, 'POST');
    

    It probably doesn't make much of a difference, but to provide some context, I've got a javascript and knockout UI calling into WebAPI, MVC4, and nHibernate. The 'format=csv' part of the query string triggers a MediaTypeFormatter to convert the returned models into a CSV file type. If I leave that off, then I get the models back from the API and can populate a Slick grid for display.

    0 讨论(0)
提交回复
热议问题