Desejo enviar uma "solicitação de download de Ajax" quando clico em um botão, então tentei desta forma:
javascript:
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();
download.php:
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");
readfile("file.txt");
?>
mas não funciona conforme o esperado, como posso fazer? Agradeço antecipadamente
location.href='download.php';
Respostas:
Atualização em 27 de abril de 2015
O atributo de download está em alta e chegando à cena do HTML5 . É compatível com Firefox e Chrome, e em breve chegará ao IE11. Dependendo de suas necessidades, você pode usá-lo em vez de uma solicitação AJAX (ou usando
window.location
), desde que o arquivo que deseja baixar seja da mesma origem do seu site.Você sempre pode fazer a solicitação AJAX /
window.location
um fallback usando algum JavaScript para testar sedownload
é compatível e, se não for, alternando para chamarwindow.location
.Resposta original
Você não pode fazer com que uma solicitação AJAX abra o prompt de download, pois é necessário navegar fisicamente até o arquivo para solicitar o download. Em vez disso, você pode usar uma função de sucesso para navegar até download.php. Isso abrirá o prompt de download, mas não mudará a página atual.
Mesmo que isso responda à pergunta, é melhor apenas usar
window.location
e evitar totalmente a solicitação AJAX.fonte
Na verdade, você não precisa de Ajax para isso. Se você apenas definir "download.php" como o href no botão, ou, se não for um link, use:
O navegador deve reconhecer o download binário e não carregar a página real, mas apenas servir o arquivo como um download.
fonte
window.location
é JavaScript.Para fazer o navegador baixar um arquivo, você precisa fazer a solicitação assim:
fonte
<a>
tag com JS, "on the fly" também, mas precisa anexá-la adocument.body
. Você certamente deseja ocultá-lo ao mesmo tempo.Solução para vários navegadores, testada no Chrome, Firefox, Edge, IE11.
No DOM, adicione uma tag de link oculto:
Então:
fonte
Authorization
?window.URL.revokeObjectURL(el.href);
depoisel.click()
?É possível. Você pode ter o download iniciado de dentro de uma função ajax, por exemplo, logo após o arquivo .csv ser criado.
Eu tenho uma função ajax que exporta um banco de dados de contatos para um arquivo .csv e, assim que termina, ele inicia automaticamente o download do arquivo .csv. Então, depois que obtenho o responseText e tudo está OK, redireciono o navegador assim:
Meu arquivo download.php se parece com este:
Não há atualização de página e o download do arquivo é iniciado automaticamente.
NOTA - Testado nos seguintes navegadores:
fonte
eu prefiro
location.assign(url);
Exemplo de sintaxe completo:
developer.mozilla.org/en-US/docs/Web/API/Location.assign
fonte
Decodificar um nome de arquivo do cabeçalho é um pouco mais complexo ...
fonte
Esta solução não é muito diferente das anteriores, mas para mim funciona muito bem e acho que está limpa.
Sugiro codificar em base64 o lado do servidor de arquivos (base64_encode (), se você estiver usando PHP) e enviar os dados codificados em base64 para o cliente
No cliente, você faz isso:
Este código coloca os dados codificados em um link e simula um clique no link, depois o remove.
fonte
Suas necessidades são atendidas por
window.location('download.php');
Mas acho que você precisa passar o arquivo a ser baixado, nem sempre baixar o mesmo arquivo, e é por isso que você está usando um pedido, uma opção é criar um arquivo php tão simples como showfile.php e faça um pedido como
showfile.php
em que arquivo é o nome do arquivo passado por Get ou Post na solicitação e, em seguida, captura a resposta em uma função simplesmente
fonte
existe outra solução para baixar uma página da web em ajax. Mas estou me referindo a uma página que primeiro deve ser processada e depois baixada.
Primeiro você precisa separar o processamento da página do download dos resultados.
1) Apenas os cálculos da página são feitos na chamada ajax.
Espero que esta solução possa ser útil para muitos, como foi para mim.
fonte
Para aqueles que procuram uma abordagem mais moderna, você pode usar o
fetch API
. O exemplo a seguir mostra como fazer download de um arquivo de planilha. Isso é feito facilmente com o código a seguir.Acredito que essa abordagem seja muito mais fácil de entender do que outras
XMLHttpRequest
soluções. Além disso, possui uma sintaxe semelhante àjQuery
abordagem, sem a necessidade de adicionar quaisquer bibliotecas adicionais.Claro, eu aconselharia verificar para qual navegador você está desenvolvendo, já que essa nova abordagem não funcionará no IE. Você pode encontrar a lista completa de compatibilidade de navegadores no link a seguir .
Importante : neste exemplo, estou enviando uma solicitação JSON a um servidor que está escutando no dado
url
. Issourl
deve ser definido, no meu exemplo, estou assumindo que você conhece esta parte. Além disso, considere os cabeçalhos necessários para que sua solicitação funcione. Como estou enviando um JSON, devo adicionar oContent-Type
cabeçalho e defini-loapplication/json; charset=utf-8
como, para permitir que o servidor saiba o tipo de solicitação que receberá.fonte
A solução @Joao Marcos funciona para mim, mas tive que modificar o código para fazê-lo funcionar no IE, abaixo se é o código
fonte