J'ai une classe d'action qui génère un PDF. Le contentType
est réglé de manière appropriée.
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment=\"" + report.getName() + "\"";
contentType = "application/pdf";
return SUCCESS;
}
}
J'appelle cela action
via un appel Ajax. Je ne connais pas la manière de fournir ce flux au navigateur. J'ai essayé quelques trucs mais rien n'a fonctionné.
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
Ce qui précède donne l'erreur:
Votre navigateur a envoyé une demande que ce serveur n'a pas pu comprendre.
la source
content-disposition
est réglé surattachment
, vous n'obtiendrez qu'unSave as
dialogue. La page parente restera inchangée. Juste<a href="pdfservlet/filename.pdf">pdf</a>
ou un<form action="pdfservlet/filename.pdf"><input type="submit"></form>
est plus que suffisant.POST
données.Voici comment cela fonctionne
Réponse mise à jour à l'aide de download.js
la source
Je ne pense pas vraiment qu'aucune des réponses passées ait identifié le problème de l'affiche originale. Ils supposent tous une demande GET pendant que l'affiche essayait de POSTER des données et d'obtenir un téléchargement en réponse.
Au cours de la recherche d'une meilleure réponse, nous avons trouvé ce plugin jQuery pour demander des téléchargements de fichiers de type Ajax .
Dans son "cœur", il crée un formulaire HTML "temporaire" contenant les données données comme champs d'entrée. Ce formulaire est ajouté au document et publié à l'URL souhaitée. Juste après cela, le formulaire est à nouveau supprimé:
La réponse de Update Mayur semble assez prometteuse et très simple par rapport au plug-in jQuery auquel j'ai fait référence.
la source
C'est ainsi que je résous ce problème.
La réponse de Jonathan Amend sur ce post m'a beaucoup aidé.
L'exemple ci-dessous est simplifié.
Pour plus de détails, le code source ci-dessus est capable de télécharger un fichier à l'aide d'une requête JQuery Ajax (GET, POST, PUT, etc.) . Cela permet également de télécharger des paramètres au format JSON et de changer le type de contenu en application / json (par défaut) .
La source html :
Un formulaire simple avec deux entrées de texte, une sélection et un élément bouton.
La source de la page javascript :
Un simple événement sur clic de bouton. Il crée un objet AjaxDownloadFile. La source de la classe AjaxDownloadFile est ci-dessous.
La source de la classe AjaxDownloadFile :
J'ai créé cette classe pour l'ajouter à ma bibliothèque JS. Il est réutilisable. J'espère que cela pourra aider.
la source
Blob
objet est pris en charge dans IE10 +.responseType
xhr surarraybuffer
oublob
pour que cela fonctionne. (Sinon, cela fonctionne très bien.)Ce qui a fonctionné pour moi est le code suivant, car la fonction serveur récupère
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
la source
Vous pouvez utiliser ce plugin qui crée un formulaire, le soumet, puis le supprime de la page.
Cela a fonctionné pour moi. J'ai trouvé ce plugin ici
la source
Le code suivant a fonctionné pour moi
la source
Pour résoudre le problème du PDF vierge dans la demande de publication afin d'obtenir des données de flux telles que PDF, nous devons ajouter un type de réponse comme `` arraybuffer '' ou `` blob '' dans la demande.
la source
Concernant la réponse donnée par Mayur Padshala, c'est la bonne logique pour télécharger un fichier pdf via ajax mais comme d'autres le rapportent dans les commentaires, cette solution consiste en effet à télécharger un pdf vierge.
La raison en est expliquée dans la réponse acceptée à cette question : jQuery a quelques problèmes pour charger des données binaires à l'aide de requêtes AJAX, car il n'implémente pas encore certaines fonctionnalités HTML5 XHR v2, voir cette demande d' amélioration et cette discussion .
Donc, l'utilisation
HTMLHTTPRequest
du code devrait ressembler à ceci:la source
créez un iframe caché, puis dans votre code ajax ci-dessus:
url:
document.getElementById('myiframeid').src = your_server_side_url
,et retirez le
window.open(response);
la source
Cet extrait est destiné aux utilisateurs angular js qui seront confrontés au même problème, notez que le fichier de réponse est téléchargé en utilisant un événement de clic programmé. Dans ce cas, les en-têtes ont été envoyés par le serveur contenant le nom de fichier et le contenu / type.
la source
Devez-vous le faire avec Ajax? Ne serait-il pas possible de le charger dans une iframe?
la source
J'espère que cela vous fera gagner quelques heures et vous épargnera un mal de tête. Cela m'a pris un certain temps pour comprendre cela, mais faire une requête $ .ajax () régulière a ruiné mon fichier PDF, tout en le demandant via la barre d'adresse fonctionnait parfaitement. La solution était la suivante:
Incluez download.js: http://danml.com/download.html
Utilisez ensuite XMLHttpRequest au lieu de la requête $ .ajax ().
la source
la source
Si vous devez travailler avec un flux de fichiers (donc pas de PDF enregistré physiquement) comme nous le faisons et que vous souhaitez télécharger le PDF sans rechargement de page, la fonction suivante fonctionne pour nous:
HTML
Javascript
En raison de target = "pdf-download-output" , la réponse est écrite dans l'iframe et par conséquent aucun rechargement de page n'est exécuté, mais le flux de réponse pdf est sorti dans le navigateur sous forme de téléchargement.
la source