Vejo que você já descobriu uma solução, no entanto, eu só queria adicionar algumas informações que podem ajudar alguém tentando conseguir a mesma coisa com grandes solicitações de POST.
Eu tive o mesmo problema há algumas semanas atrás, na verdade, não é possível obter um download "limpo" através do AJAX, o Filament Group criou um plugin jQuery que funciona exatamente como você já descobriu, é chamado de arquivo jQuery Baixe, no entanto, há uma desvantagem nessa técnica.
Se você estiver enviando grandes solicitações através do AJAX (digamos, arquivos + 1 MB), isso afetará negativamente a capacidade de resposta. Em conexões lentas com a Internet, você terá que esperar muito até que a solicitação seja enviada e também aguardar o download do arquivo. Não é como um instante "clique" => "pop-up" => "início do download". É mais como "clique" => "aguarde até que os dados sejam enviados" => "aguarde a resposta" => "download start", o que faz com que o arquivo apareça dobrar de tamanho, porque você terá que aguardar o envio da solicitação através do AJAX e recupere-o como um arquivo para download.
Se você estiver trabalhando com arquivos pequenos <1 MB, não perceberá isso. Mas, como descobri no meu próprio aplicativo, para tamanhos de arquivo maiores, é quase insuportável.
Meu aplicativo permite que os usuários exportem imagens geradas dinamicamente, essas imagens são enviadas através de solicitações POST no formato base64 para o servidor (é a única maneira possível), processadas e enviadas de volta aos usuários na forma de arquivos .png, .jpg, base64 seqüências de caracteres para imagens + 1 MB são enormes, forçando os usuários a esperar mais do que o necessário para o arquivo iniciar o download. Em conexões lentas com a Internet, pode ser realmente irritante.
Minha solução para isso foi gravar temporariamente o arquivo no servidor, assim que estiver pronto, gerar dinamicamente um link para o arquivo na forma de um botão que muda entre os estados "Aguarde ..." e "Download" e, ao mesmo tempo, Na hora, imprima a imagem base64 em uma janela pop-up para que os usuários possam "clicar com o botão direito" e salvá-la. Isso torna todo o tempo de espera mais suportável para os usuários e também acelera as coisas.
Atualização 30 de setembro de 2014:
Meses se passaram desde que publiquei isso, finalmente encontrei uma abordagem melhor para acelerar as coisas ao trabalhar com grandes seqüências de caracteres base64. Agora, armazeno as seqüências base64 no banco de dados (usando campos longtext ou longblog), depois passo seu ID de registro pelo jQuery File Download, finalmente no arquivo de script de download, consulta o banco de dados usando esse ID para puxar a sequência base64 e passá-la através a função de download.
Faça o download do exemplo de script:
<?php
// Record ID
$downloadID = (int)$_POST['id'];
// Query Data (this example uses CodeIgniter)
$data = $CI->MyQueries->GetDownload( $downloadID );
// base64 tags are replaced by [removed], so we strip them out
$base64 = base64_decode( preg_replace('#\[removed\]#', '', $data[0]->image) );
// This example is for base64 images
$imgsize = getimagesize( $base64 );
// Set content headers
header('Content-Disposition: attachment; filename="my-file.png"');
header('Content-type: '.$imgsize['mime']);
// Force download
echo $base64;
?>
Sei que isso está muito além do que o OP pediu, mas achei que seria bom atualizar minha resposta com minhas descobertas. Quando eu estava procurando soluções para o meu problema, li muitos tópicos "Download de dados do AJAX POST" que não me deram a resposta que eu estava procurando, espero que essas informações ajudem alguém que deseja obter algo assim.