Handle file download from ajax post

前端 未结 20 2634
心在旅途
心在旅途 2020-11-21 05:46

I have a javascript app that sends ajax POST requests to a certain URL. Response might be a JSON string or it might be a file (as an attachment). I can easily detect Content

相关标签:
20条回答
  • 2020-11-21 06:23

    there is another solution to download a web page in ajax. But I am referring to a page that must first be processed and then downloaded.

    First you need to separate the page processing from the results download.

    1) Only the page calculations are made in the ajax call.

    $.post("CalculusPage.php", { calculusFunction: true, ID: 29, data1: "a", data2: "b" },
    
           function(data, status) 
           {
                if (status == "success") 
                {
                    /* 2) In the answer the page that uses the previous calculations is downloaded. For example, this can be a page that prints the results of a table calculated in the ajax call. */
                    window.location.href = DownloadPage.php+"?ID="+29;
                }               
           }
    );
    
    // For example: in the CalculusPage.php
    
        if ( !empty($_POST["calculusFunction"]) ) 
        {
            $ID = $_POST["ID"];
    
            $query = "INSERT INTO ExamplePage (data1, data2) VALUES ('".$_POST["data1"]."', '".$_POST["data2"]."') WHERE id = ".$ID;
            ...
        }
    
    // For example: in the DownloadPage.php
    
        $ID = $_GET["ID"];
    
        $sede = "SELECT * FROM ExamplePage WHERE id = ".$ID;
        ...
    
        $filename="Export_Data.xls";
        header("Content-Type: application/vnd.ms-excel");
        header("Content-Disposition: inline; filename=$filename");
    
        ...
    

    I hope this solution can be useful for many, as it was for me.

    0 讨论(0)
  • 2020-11-21 06:28

    This is a 3 years old question but I had the same problem today. I looked your edited solution but I think that it can sacrifice the performance because it has to make a double request. So if anyone needs another solution that doesn't imply to call the service twice then this is the way I did it:

    <form id="export-csv-form" method="POST" action="/the/path/to/file">
        <input type="hidden" name="anyValueToPassTheServer" value="">
    </form>
    

    This form is just used to call the service and avoid to use a window.location(). After that you just simply have to make a form submit from jquery in order to call the service and get the file. It's pretty simple but this way you can make a download using a POST. I now that this could be easier if the service you're calling is a GET, but that's not my case.

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