Widzę, że już znalazłeś rozwiązanie, ale chciałem tylko dodać informacje, które mogą pomóc komuś, kto próbuje osiągnąć to samo przy dużych żądaniach POST.
Miałem ten sam problem kilka tygodni temu, w rzeczywistości nie można uzyskać „czystego” pobrania przez AJAX, Grupa Filament utworzyła wtyczkę jQuery, która działa dokładnie tak, jak już się dowiedziałeś, nazywa się jQuery File Pobierz jednak ta technika ma wadę.
Jeśli wysyłasz duże żądania za pośrednictwem AJAX (powiedzmy, pliki + 1 MB), będzie to miało negatywny wpływ na czas reakcji. W wolnych połączeń internetowych musisz czekać wiele , dopóki żądanie jest wysyłane, a także czekać na pliku do pobrania. To nie jest jak natychmiastowe „kliknięcie” => „popup” => „rozpoczęcie pobierania”. To bardziej jak „kliknięcie” => „poczekaj, aż dane zostaną wysłane” => „poczekaj na odpowiedź” => „rozpocznij pobieranie”, co sprawia, że plik ma dwukrotnie większy rozmiar, ponieważ musisz poczekać na wysłanie żądania przez AJAX i odzyskaj jako plik do pobrania.
Jeśli pracujesz z małymi rozmiarami plików <1 MB, nie zauważysz tego. Ale jak odkryłem we własnej aplikacji, w przypadku większych plików jest to prawie nie do zniesienia.
Moja aplikacja pozwala użytkownikom eksportować obrazy generowane dynamicznie, obrazy te są wysyłane za pośrednictwem żądań POST w formacie base64 na serwer (jest to jedyny możliwy sposób), a następnie przetwarzane i wysyłane z powrotem do użytkowników w postaci plików .png, .jpg, base64 ciągi obrazów + 1 MB są ogromne, co zmusza użytkowników do czekania dłużej niż jest to konieczne do rozpoczęcia pobierania pliku. W wolnych połączeniach internetowych może to być naprawdę denerwujące.
Moim rozwiązaniem było tymczasowe zapisanie pliku na serwerze, gdy będzie on gotowy, dynamiczne generowanie linku do pliku w postaci przycisku, który zmienia się między stanami „Proszę czekać ...” i „Pobierz” i jednocześnie czas, wydrukuj obraz base64 w wyskakującym oknie podglądu, aby użytkownicy mogli kliknąć prawym przyciskiem myszy i zapisać go. To sprawia, że cały czas oczekiwania jest bardziej znośny dla użytkowników, a także przyspiesza.
Aktualizacja 30 września 2014:
Minęły miesiące, odkąd to opublikowałem, wreszcie znalazłem lepsze podejście do przyspieszenia pracy z dużymi ciągami base64. Teraz przechowuję ciągi base64 w bazie danych (używając pól longtext lub longblog), następnie przekazuję jego identyfikator rekordu poprzez pobieranie pliku jQuery, w końcu w pliku skryptu pobierania przeszukuję bazę danych przy użyciu tego identyfikatora, aby pobrać ciąg base64 i przekazać go funkcja pobierania.
Pobierz przykładowy skrypt:
<?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;
?>
Wiem, że jest to o wiele więcej niż to, o co poprosił PO, ale czułem, że dobrze byłoby zaktualizować moją odpowiedź o moje ustalenia. Kiedy szukałem rozwiązań mojego problemu, przeczytałem wiele wątków „Pobierz z danych AJAX POST”, które nie dały mi odpowiedzi, której szukałem, mam nadzieję, że te informacje pomogą komuś, kto chce osiągnąć coś takiego.