Veo que ya ha encontrado una solución, sin embargo, solo quería agregar información que pueda ayudar a alguien que intenta lograr lo mismo con grandes solicitudes POST.
Tuve el mismo problema hace un par de semanas, de hecho, no es posible lograr una descarga "limpia" a través de AJAX, el Grupo Filament creó un complemento jQuery que funciona exactamente como ya lo descubrió, se llama jQuery File Descargar sin embargo, hay una desventaja en esta técnica.
Si envía solicitudes grandes a través de AJAX (digamos archivos + 1 MB), tendrá un impacto negativo en la capacidad de respuesta. En conexiones lentas a Internet, tendrá que esperar mucho hasta que se envíe la solicitud y también esperar a que se descargue el archivo. No es como un "clic" instantáneo => "emergente" => "inicio de descarga". Es más como "hacer clic" => "esperar hasta que se envíen los datos" => "esperar respuesta" => "inicio de descarga", lo que hace que parezca que el archivo duplica su tamaño porque tendrá que esperar a que se envíe la solicitud a través de AJAX y recuperarlo como un archivo descargable.
Si está trabajando con archivos de tamaño pequeño <1 MB, no lo notará. Pero como descubrí en mi propia aplicación, para archivos de mayor tamaño es casi insoportable.
Mi aplicación permite a los usuarios exportar imágenes generadas dinámicamente, estas imágenes se envían a través de solicitudes POST en formato base64 al servidor (es la única forma posible), luego se procesan y se envían a los usuarios en forma de archivos .png, .jpg, base64 Las cadenas de imágenes + 1 MB son enormes, esto obliga a los usuarios a esperar más de lo necesario para que el archivo comience a descargarse. En conexiones lentas a Internet puede ser realmente molesto.
Mi solución para esto fue escribir temporalmente el archivo en el servidor, una vez que esté listo, generar dinámicamente un enlace al archivo en forma de un botón que cambia entre los estados "Por favor, espere ..." y "Descargar" y al mismo tiempo vez, imprima la imagen base64 en una ventana emergente de vista previa para que los usuarios puedan hacer clic con el botón derecho y guardarla. Esto hace que todo el tiempo de espera sea más soportable para los usuarios, y también acelera las cosas.
Actualización 30 de septiembre 2014:
Han pasado meses desde que publiqué esto, finalmente encontré un mejor enfoque para acelerar las cosas cuando trabajo con grandes cadenas de base64. Ahora almaceno cadenas base64 en la base de datos (usando campos de texto largo o de registro largo), luego paso su ID de registro a través de jQuery File Download, finalmente en el archivo de script de descarga, consulto la base de datos usando esta ID para extraer la cadena base64 y pasarla La función de descarga.
Descargar Script Ejemplo:
<?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;
?>
Sé que esto va mucho más allá de lo que pidió el OP, sin embargo, sentí que sería bueno actualizar mi respuesta con mis hallazgos. Cuando estaba buscando soluciones a mi problema, leí muchos hilos de "Descarga de datos POST AJAX" que no me dieron la respuesta que estaba buscando, espero que esta información ayude a alguien que busca lograr algo como esto.