Tenho uma classe de ação que gera um PDF. O contentType
está definido corretamente.
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;
}
}
Eu chamo isso action
por meio de uma chamada Ajax. Não sei como entregar este stream ao navegador. Tentei algumas coisas, mas nada funcionou.
$.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));
}
});
O acima dá o erro:
Seu navegador enviou uma solicitação que este servidor não conseguiu entender.
fonte
content-disposition
estiver definido comoattachment
, você obterá apenas umSave as
diálogo. A página pai permanecerá inalterada. Apenas<a href="pdfservlet/filename.pdf">pdf</a>
ou a<form action="pdfservlet/filename.pdf"><input type="submit"></form>
é mais do que suficiente.POST
dados.Aqui está como eu fiz isso funcionar
Resposta atualizada usando download.js
fonte
Eu realmente não acho que nenhuma das respostas anteriores tenha identificado o problema do pôster original. Todos eles presumem uma solicitação GET enquanto o autor da postagem estava tentando POSTAR os dados e obter um download em resposta.
No decorrer da busca por uma resposta melhor, encontramos este plug-in jQuery para solicitação de downloads de arquivos do tipo Ajax .
Em seu "coração", ele cria um formulário HTML "temporário" contendo os dados fornecidos como campos de entrada. Este formulário é anexado ao documento e postado no URL desejado. Logo em seguida, o formulário é removido novamente:
Atualizar a resposta de Mayur parece muito promissor e muito simples em comparação com o plug-in jQuery a que me referi.
fonte
É assim que eu resolvo esse problema.
A resposta de Jonathan Amend neste post me ajudou muito.
O exemplo abaixo é simplificado.
Para mais detalhes, o código-fonte acima é capaz de baixar um arquivo usando uma solicitação JQuery Ajax (GET, POST, PUT etc) . Também ajuda a carregar parâmetros como JSON e a alterar o tipo de conteúdo para application / json (meu padrão) .
A fonte html :
Um formulário simples com dois textos de entrada, um selecionar e um elemento de botão.
A fonte da página javascript :
Um evento simples no clique do botão. Ele cria um objeto AjaxDownloadFile. A fonte da classe AjaxDownloadFile está abaixo.
A fonte da classe AjaxDownloadFile :
Criei esta classe para adicionar à minha biblioteca JS. É reutilizável. Espero que ajude.
fonte
Blob
objeto é compatível com IE10 +.responseType
de xhr paraarraybuffer
oublob
para que isso funcionasse. (Caso contrário, funciona muito bem.)O que funcionou para mim foi o seguinte código, pois a função do servidor está recuperando
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
fonte
Você pode usar este plug-in que cria um formulário, o envia e, em seguida, o remove da página.
Isso funcionou para mim. Encontrou este plugin aqui
fonte
O código a seguir funcionou para mim
fonte
Para corrigir o problema do PDF em branco na pós-solicitação para obter dados de fluxo como PDF, precisamos adicionar o tipo de resposta como 'arraybuffer' ou 'blob' na solicitação
fonte
Em relação à resposta dada por Mayur Padshala esta é a lógica correta para baixar um arquivo pdf via ajax, mas como outros relatam nos comentários esta solução é de fato baixar um pdf em branco.
O motivo para isso é explicado na resposta aceita a esta pergunta : jQuery tem alguns problemas ao carregar dados binários usando solicitações AJAX, pois ainda não implementa alguns recursos de HTML5 XHR v2, consulte esta solicitação de aprimoramento e esta discussão .
Portanto, o uso
HTMLHTTPRequest
do código deve ser assim:fonte
crie um iframe oculto e, em seguida, em seu código ajax acima:
url:
document.getElementById('myiframeid').src = your_server_side_url
,e remova o
window.open(response);
fonte
Este snippet é para usuários do Angular js que enfrentarão o mesmo problema. Observe que o arquivo de resposta é baixado usando um evento de clique programado. Neste caso, os cabeçalhos foram enviados pelo servidor contendo o nome do arquivo e o conteúdo / tipo.
fonte
Você tem que fazer isso com Ajax? Não seria uma possibilidade carregá-lo em um iframe?
fonte
Espero que isso economize algumas horas e evite uma dor de cabeça. Levei um tempo para descobrir isso, mas fazer uma solicitação $ .ajax () regular estragou meu arquivo PDF, enquanto solicitá-lo por meio da barra de endereços funcionou perfeitamente. A solução foi esta:
Incluir download.js: http://danml.com/download.html
Em seguida, use XMLHttpRequest em vez da solicitação $ .ajax ().
fonte
fonte
Se você tiver que trabalhar com fluxo de arquivo (portanto, nenhum PDF salvo fisicamente) como fazemos e quiser baixar o PDF sem recarregar a página, a seguinte função funciona para nós:
HTML
Javascript
Devido ao target = "pdf-download-output" , a resposta é gravada no iframe e, portanto, nenhuma recarga de página é executada, mas o fluxo de resposta de pdf é gerado no navegador como um download.
fonte