Zaten bir çözüm bulduğunuzu görüyorum, ancak sadece büyük POST istekleriyle aynı şeyi başarmaya çalışan birine yardımcı olabilecek bazı bilgiler eklemek istedim.
Birkaç hafta önce aynı sorunu yaşadım, gerçekten AJAX aracılığıyla "temiz" bir indirme elde etmek mümkün değil, Filament Grubu tam olarak nasıl bulduğunuzu çalıştıran bir jQuery eklentisi oluşturdu, buna jQuery Dosyası denir Ancak indir bu tekniğin bir dezavantajı var.
AJAX aracılığıyla büyük talepler gönderiyorsanız (diyelim ki dosyalar + 1MB) yanıt vermeyi olumsuz yönde etkileyecektir. Yavaş İnternet bağlantılarında çok beklemek zorunda kalacaksınız , istek gönderilinceye kadar beklemeniz ve ayrıca dosyanın indirilmesini beklemeniz gerekir. Anlık bir "click" => "popup" => "indirme başlat" gibi değildir. Daha çok "click" => "veri gönderilinceye kadar bekle" => "yanıt bekle" => "indirme başlangıcı" gibi bir dosya var, çünkü isteğin gönderilmesini beklemek zorunda kalacaksınız. AJAX aracılığıyla indirin ve indirilebilir bir dosya olarak geri alın.
1 MB'tan küçük dosya boyutları ile çalışıyorsanız bunu fark etmeyeceksiniz. Ancak kendi uygulamamda keşfettiğim gibi, daha büyük dosya boyutları için neredeyse dayanılmaz.
Uygulamam, kullanıcıların dinamik olarak oluşturulan görüntüleri dışa aktarmasına izin veriyor, bu görüntüler POST istekleri aracılığıyla base64 biçiminde sunucuya gönderiliyor (tek olası yol), daha sonra işleniyor ve .png, .jpg dosyaları, base64 biçiminde kullanıcılara geri gönderiliyor + 1MB resimler için dizeler çok büyük, bu da kullanıcıları dosyanın indirilmeye başlaması için gereğinden fazla beklemeye zorluyor. Yavaş İnternet bağlantılarında gerçekten can sıkıcı olabilir.
Bunun benim çözümü, dosyayı sunucuya geçici olarak yazmaktı, hazır olduğunda, dinamik olarak "Lütfen bekleyin ..." ve "İndir" durumları arasında değişen bir düğme şeklinde dosyaya bir bağlantı oluşturmak ve aynı zamanda zaman, kullanıcıların "sağ tıklayıp" kaydedebilmesi için base64 görüntüsünü bir önizleme açılır penceresine yazdırın. Bu, tüm bekleme süresini kullanıcılar için daha katlanılabilir hale getirir ve ayrıca işleri hızlandırır.
30 Eylül 2014 Güncellemesi:
Bunu yayınladığımdan bu yana aylar geçti, sonunda büyük base64 dizeleriyle çalışırken işleri hızlandırmak için daha iyi bir yaklaşım buldum. Şimdi veritabanına base64 dizeleri depolamak (longtext veya longblog alanları kullanarak), daha sonra jQuery File Download üzerinden kayıt kimliğini geçiyorum, nihayet karşıdan yükleme komut dosyası üzerinde base64 dizesini çekmek ve geçmek için bu kimliği kullanarak veritabanını sorgulamak indirme işlevi.
Komut Dosyasını İndir Örnek:
<?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;
?>
Bunun OP'nin istediklerinin çok ötesinde olduğunu biliyorum, ancak cevabımı bulgularımla güncellemenin iyi olacağını hissettim. Sorunum için çözümler ararken , aradığım yanıtı vermeyen çok sayıda "AJAX POST verilerinden indir" konuları okudum , umarım bu bilgiler böyle bir şeye ulaşmak isteyen birine yardımcı olur.