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
- Haben Sie versucht
location.assign
in javascript? ( w3schools.com/jsref/met_loc_assign.asp ). Hinweis: Dies funktioniert nur auf relativ aktuellen Browsern (basiert auf: stackoverflow.com/a/9723787/624590 , obwohl für viele diese Browser sind alt genug, das sollte kein Problem sein). - Möglicherweise können Sie finden hier einige nützliche Informationen stackoverflow.com/questions/4545311/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich löste dies durch die Verwendung John Culviner's jQuery.Dateidownload - Bibliothek (siehe diese SO-Antwort).
Bei der Verwendung von jQuery.Dateidownload ich hatte zu tun, fügen Sie zwei Dinge zu mein code.
Set-cookie
setcookie('fileDownload', "true", NULL, '/');
Set-Cookie: fileDownload=true; path=/
Call
$.fileDownload('/api/download');
von js. Und entfernen Sie die Verwendung von angular - $http.Sehen dieser blog für weitere Informationen, wie Sie mit jQuery.fileDownload.
Wenn jemand eine Lösung um dies zu tun, ohne über einen jQuery-Bibliothek, fühlen Sie sich frei, um es zu veröffentlichen, als eine Antwort.
Funktioniert Super
Authorization
etc.