Welche serverseitige Sprache verwenden Sie? In meiner App kann ich leicht eine Datei von einem AJAX-Aufruf herunterladen, indem ich die richtigen Header in der PHP-Antwort einstelle:
Header serverseitig einstellen
header("HTTP/1.1 200 OK");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// Der optionale zweite 'replace'-Parameter gibt an, ob der Header
// einen zuvor ähnlichen Header ersetzen oder einen zweiten Header
// des gleichen Typs hinzufügen soll. Standardmäßig ersetzt es, aber
// wenn Sie FALSE als zweites Argument übergeben, können Sie mehrere
// Header desselben Typs erzwingen.
header("Cache-Control: private", false);
header("Content-type: " . $mimeType);
// $strFileName ist natürlich der Dateiname der heruntergeladenen Datei.
// Dies muss nicht der gleiche Name wie die tatsächliche Datei sein.
header("Content-Disposition: attachment; filename=\"{$strFileName}\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . mb_strlen($strFile));
// $strFile ist eine binäre Darstellung der heruntergeladenen Datei.
echo $strFile;
Dies wird tatsächlich den Browser auf diese Download-Seite 'umleiten', aber wie @ahren bereits in seinem Kommentar sagte, wird er nicht von der aktuellen Seite navigieren.
Es geht darum, die richtigen Header einzustellen, also bin ich sicher, dass Sie eine geeignete Lösung für die serverseitige Sprache finden werden, die Sie verwenden, wenn es nicht PHP ist.
Behandlung der Antwort auf der Clientseite
Angenommen, Sie wissen bereits, wie man einen AJAX-Aufruf macht. Auf der Clientseite führen Sie dann eine AJAX-Anfrage an den Server aus. Der Server generiert dann einen Link, von dem aus diese Datei heruntergeladen werden kann, z.B. die 'weiterleitende' URL, auf die Sie zeigen möchten. Zum Beispiel antwortet der Server mit:
{
status: 1, // ok
// einzigartiges einmaliges Download-Token, nicht erforderlich, natürlich
message: 'http://ihrewebsite.com/getdownload/ska08912dsa'
}
Beim Verarbeiten der Antwort fügen Sie ein iframe
in Ihren Körper ein und setzen den SRC des iframe
auf die URL, die Sie gerade erhalten haben, wie folgt (mit jQuery für die Vereinfachung dieses Beispiels):
$("body").append("");
Wenn Sie die Header richtig gesetzt haben, wird das iframe einen Download-Dialog erzwingen, ohne den Browser von der aktuellen Seite zu navigieren.
Anmerkung
Zusätzliche Ergänzung in Bezug auf Ihre Frage; Ich denke, es ist am besten, immer JSON zurückzugeben, wenn Sie mit AJAX-Technologie nach Daten fragen. Nachdem Sie die JSON-Antwort erhalten haben, können Sie dann auf der Clientseite entscheiden, was damit zu tun ist. Möglicherweise möchten Sie beispielsweise später, dass der Benutzer auf einen Download-Link zur URL klickt, anstatt den Download direkt zu erzwingen. In Ihrer aktuellen Konfiguration müssten Sie sowohl auf Client- als auch auf Serverseite aktualisieren, um dies zu tun.