Tengo una clase de acción que genera un PDF. El contentType
está configurado apropiadamente.
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;
}
}
Llamo a esto a action
través de una llamada Ajax. No sé la forma de enviar esta transmisión al navegador. Probé algunas cosas pero nada funcionó.
$.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));
}
});
Lo anterior da el error:
Su navegador envió una solicitud que este servidor no pudo entender.
fuente
content-disposition
está configurado enattachment
, solo obtendrá unSave as
diálogo. La página principal no se modificará. Solo<a href="pdfservlet/filename.pdf">pdf</a>
o a<form action="pdfservlet/filename.pdf"><input type="submit"></form>
es más que suficiente.POST
datos.Así es como hice que esto funcionara
Respuesta actualizada usando download.js
fuente
Realmente no creo que ninguna de las respuestas anteriores haya detectado el problema del póster original. Todos suponen una solicitud GET mientras el autor intentaba PUBLICAR datos y obtener una descarga en respuesta.
En el curso de la búsqueda de una mejor respuesta, encontramos este complemento jQuery para solicitar descargas de archivos similares a Ajax .
En su "corazón" crea un formulario HTML "temporal" que contiene los datos dados como campos de entrada. Este formulario se adjunta al documento y se publica en la URL deseada. Inmediatamente después de eso, el formulario se elimina nuevamente:
La respuesta de Update Mayur parece bastante prometedora y muy simple en comparación con el complemento jQuery al que me referí.
fuente
Así es como resuelvo este problema.
La respuesta de Jonathan Modif en este post me ayudó mucho.
El siguiente ejemplo está simplificado.
Para obtener más detalles, el código fuente anterior puede descargar un archivo mediante una solicitud JQuery Ajax (GET, POST, PUT, etc.) . También ayuda a cargar parámetros como JSON y a cambiar el tipo de contenido a application / json (mi predeterminado) .
La fuente html :
Un formulario simple con dos entradas de texto, una selección y un elemento de botón.
La fuente de la página javascript :
Un simple evento al hacer clic en un botón. Crea un objeto AjaxDownloadFile. La fuente de la clase AjaxDownloadFile se encuentra a continuación.
La fuente de la clase AjaxDownloadFile :
Creé esta clase para agregarla a mi biblioteca JS. Es reutilizable. Espero que ayude.
fuente
Blob
El objeto es compatible con IE10 +.responseType
de xhr enarraybuffer
oblob
para que esto funcione. (De lo contrario, esto funciona muy bien)Lo que funcionó para mí es el siguiente código, ya que la función del servidor está recuperando
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
fuente
Puede usar este complemento que crea un formulario, lo envía y luego lo elimina de la página.
Esto funcionó para mí. Encontré este complemento aquí
fuente
El siguiente código funcionó para mí
fuente
Para solucionar el problema de PDF en blanco en la solicitud posterior para obtener datos de transmisión como PDF, debemos agregar el tipo de respuesta como 'arraybuffer' o 'blob' en la solicitud
fuente
Sobre la respuesta dada por Mayur Padshala esta es la lógica correcta para descargar un archivo pdf a través de ajax, pero como otros informan en los comentarios, esta solución es de hecho descarga un pdf en blanco.
La razón de esto se explica en la respuesta aceptada de esta pregunta : jQuery tiene algunos problemas para cargar datos binarios usando solicitudes AJAX, ya que aún no implementa algunas capacidades HTML5 XHR v2, vea esta solicitud de mejora y esta discusión .
Entonces, usar
HTMLHTTPRequest
el código debería verse así:fuente
cree un iframe oculto, luego en su código ajax arriba:
url:
document.getElementById('myiframeid').src = your_server_side_url
,y quitar el
window.open(response);
fuente
Este fragmento es para usuarios de angular js que enfrentarán el mismo problema. Tenga en cuenta que el archivo de respuesta se descarga mediante un evento de clic programado. En este caso, los encabezados fueron enviados por el servidor que contiene el nombre del archivo y el contenido / tipo.
fuente
¿Tienes que hacerlo con Ajax? ¿No sería posible cargarlo en un iframe?
fuente
Espero que esto le ahorre algunas horas y le evite un dolor de cabeza. Me tomó un tiempo darme cuenta de esto, pero hacer una solicitud regular $ .ajax () arruinó mi archivo PDF, mientras que solicitarlo a través de la barra de direcciones funcionó perfectamente. La solución fue esta:
Incluya download.js: http://danml.com/download.html
Luego use XMLHttpRequest en lugar de la solicitud $ .ajax ().
fuente
fuente
Si tiene que trabajar con flujo de archivos (por lo que no hay PDF guardado físicamente) como lo hacemos nosotros y desea descargar el PDF sin volver a cargar la página, la siguiente función funciona para nosotros:
HTML
Javascript
Debido a target = "pdf-download-output" , la respuesta se escribe en el iframe y por lo tanto no se ejecuta la recarga de la página, pero el pdf-response-stream se genera en el navegador como una descarga.
fuente