Comment puis-je obtenir navigateur pour inviter l'utilisateur à enregistrer un fichier généré dynamiquement par le serveur?

Clients de soumettre des requêtes post à l'aide de jquery ajax comme illustré ci-dessous:

$.ajax({
    url: "/xxx?request1", 
    data: theParams,
    type: 'post',
    error: function(XMLHttpRequest, textStatus, errorThrown){
        //error handling
    },
    success: function(data){
    var theResult = JSON.parse(data);
        //success handling
    }
});

Apache est configuré pour transmettre les demandes avec /xxx? à une application personnalisée. L'application traite la demande et renvoie des informations. Habituellement, cette information est retourné sous forme de JSoN et est affiché dans la "réussite de la manipulation" de la section, à l'aide de jquery/javascript. L'application crée les en-têtes suivants (qui sont ensuite retournées via apache) avant d'écrire le JSON:

HTTP/1.0 200 OK
Connection: close
Server: MyServer v. 0.826
Content-Type: text/html

J'ai également des cookies de travail en plaçant la suite à droite après le 200 OK ligne:

Set-Cookie: cookie_name=value; Domain=example.com; Path=/; Expires=Fri, 21-Mar-2014 01:40:22 GMT; HttpOnly

Dans un scénario, j'aimerais que l'utilisateur puisse enregistrer les données renvoyées (comme un fichier texte). Mais c'est là que je rencontre des problèmes.

Si j'utilise JavaScript pour ouvrir une fenêtre et écrire les données dans la nouvelle fenêtre, j'ai trouvé que Safari et Chrome à la fois de désactiver l'option "Enregistrer sous..." du menu option (sur un Mac).

(J'ai une version de travail en utilisant base64 URI, mais qui semble négligé par rapport au reste du site.)

J'ai alors commencé à essayer de comprendre un Content-Disposition: attachment; filename=file.txt
en-tête, mais je n'ai jamais pu obtenir le navigateur pour produire une invite de commandes. J'ai essayé de placer cet en-tête à droite après le 200 OK ligne, ainsi que plus tard:

Content-Type: text/plain
Content-Disposition: attachment; filename=file.txt

En plus d'être pas sûr de la forme exacte de la Content-Disposition en-tête, je ne suis pas sûr si j'ai le Content-Type correct ou si il y a quelque chose dans l'ajax code du gestionnaire, ce qui empêche la sauver.

J'ai essayé de trouver des exemples où tout est mis en place, mais ne peut trouver des pièces et clairement je n'arrive pas à le mettre correctement ensemble. Des suggestions?

Je suis de cibler uniquement les navigateurs modernes, les trois principales plates-formes (Mac/Windows/Linux), et seulement HTML5/JavaScript côté client.

InformationsquelleAutor RPW | 2013-12-21