Datei vom server herunterladen, mit eckig $http.erhalten

Ich versuche, die trigger eine Datei heruntergeladen, wenn ein Benutzer klickt auf "Download PDF" - button. Ein Aufruf an die API, die macht ein paar Prüfungen, und gibt dann die Datei. Ich will nicht die Datei im browser geöffnet. Ich habe viel gelesen von stackoverflow-Fragen, wie Sie dies tun, aber nicht bekommen kann es arbeiten. Ich bekomme den Inhalt der Datei als text zurück, aber der browser nicht die Datei speichern, noch gibt mir die Wahl, ihn als Datei speichern.

Dies ist, was ich habe.

HTML

<button ng-click="apiDownload()">Download PDF</button>

AngularJS controller

$scope.apiDownload = function(){
    var config = {
        method: 'GET',
        url: "/api/download",
        headers: {
            'Accept': 'application/pdf'
        }
    };
    $http(config)
        .success(function(res){
            console.log(res);
        })
        .error(function(res){});
};

PHP-API (meist aus hier)

function apiDownloadFile() {
    $file_name = "download/test.pdf";
    $abs_file_name = realpath(dirname(__FILE__)).'/'.$file_name;
    if(is_file($abs_file_name) && file_exists($abs_file_name)) {

        //required for IE
        if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }

        //get the file mime type using the file extension
        switch(strtolower(substr(strrchr($file_name, '.'), 1))) {
            case 'pdf': $mime = 'application/pdf'; break;
            case 'zip': $mime = 'application/zip'; break;
            case 'jpeg':
            case 'jpg': $mime = 'image/jpg'; break;
            default: $mime = 'application/force-download';
        }
        header('Pragma: public');   //required
        header('Expires: 0');       //no cache
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($abs_file_name)).' GMT');
        header('Cache-Control: private',false);
        header('Content-Type: '.$mime);
        header('Content-Disposition: attachment; filename='.basename($abs_file_name));
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: '.filesize($abs_file_name));    //provide file size
        header('Connection: close');
        readfile($abs_file_name);       //push it out
        exit();
    }

}

Sehe ich diesen Header in chrome developer tools:

Request-Header

GET /api/download HTTP/1.1
Host: sa.dev
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/pdf
If-Modified-Since: 0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Referer: https://sa.dev/insights
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,da;q=0.6,sv;q=0.4,no;q=0.2,nb;q=0.2
Cookie: ...

Antwort-Header

HTTP/1.1 200 OK
Date: Mon, 16 Mar 2015 14:27:08 GMT
Server: Apache/2.4.9 (Unix) PHP/5.6.5 OpenSSL/0.9.8zc
X-Powered-By: PHP/5.6.5
Pragma: public
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Last-Modified: Mon, 16 Mar 2015 09:04:06 GMT
Cache-Control: private
Content-Disposition: attachment; filename=test.pdf
Content-Transfer-Encoding: binary
Content-Length: 5501633
Connection: close
Content-Type: application/pdf
InformationsquelleAutor swenedo | 2015-03-16
Schreibe einen Kommentar