Я бачу, що ви вже знайшли рішення, однак я просто хотів додати деяку інформацію, яка може допомогти комусь, хто намагається досягти того ж з великими POST-запитами.
У мене був такий самий випуск пару тижнів тому, дійсно неможливо досягти «чистого» завантаження через AJAX, група Filament створила плагін jQuery, який працює точно так, як ви вже дізналися, називається jQuery File Завантажте, проте, є недолік цієї методики.
Якщо ви надсилаєте великі запити через AJAX (скажімо, файли + 1 Мб), це негативно вплине на чуйність. У повільних підключеннях до Інтернету , вам доведеться чекати багато , поки клопотання не надсилаються , а також чекати файл для завантаження. Це не як миттєвий "click" => "popup" => "start download". Це більше схоже на "click" => "дочекатися надсилання даних" => "зачекати відповіді" => "почати завантаження", завдяки чому файл видається вдвічі більшим за його розмір, тому що вам доведеться чекати надсилання запиту через AJAX і поверніть його як завантажуваний файл.
Якщо ви працюєте з невеликими розмірами файлів <1 Мб, ви цього не помітите. Але, як я виявив у власній програмі, для великих розмірів файлів це майже нестерпно.
Моя програма дозволяє користувачам експортувати зображення, що динамічно генеруються, ці зображення надсилаються через POST-запити у форматі base64 на сервер (це єдиний можливий спосіб), потім обробляються та надсилаються користувачам у вигляді .png, .jpg файлів, base64 рядки для зображень + 1 Мб величезні, це змушує користувачів чекати більше, ніж потрібно, щоб файл розпочав завантаження. У повільних підключеннях до Інтернету це може бути дуже прикро.
Моє рішення для цього полягало в тимчасовому записуванні файлу на сервер, як тільки він буде готовий, динамічно генерувати посилання на файл у вигляді кнопки, яка змінюється між станами "Будь ласка, зачекайте ..." і "Завантажити" і одночасно Надрукуйте зображення base64 у спливаючому вікні попереднього перегляду, щоб користувачі могли «клацнути правою кнопкою миші» та зберегти її. Це робить весь час очікування більш приємним для користувачів, а також прискорює роботу.
Оновлення 30 вересня 2014 року:
Минуло місяці з моменту публікації цього запису, нарешті, я знайшов кращий підхід до прискорення роботи під час роботи з великими base64 рядками. Тепер я зберігаю рядки base64 в базі даних (використовуючи поля longtext або longblog), потім передаю її ідентифікатор запису через файл завантаження файлу jQuery, нарешті, на файл сценарію завантаження, я запитую базу даних за допомогою цього ідентифікатора, щоб витягнути рядок base64 і передати її через функція завантаження.
Приклад сценарію:
<?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;
?>
Я знаю, що це далеко не те, що запитувала ОП, проте я вважав, що було б добре доповнити свою відповідь своїми висновками. Коли я шукав рішення своєї проблеми, я прочитав багато тем "Завантажити з даних AJAX POST", які не дали мені відповіді, яку я шукав, сподіваюся, ця інформація допомагає комусь, хто прагне досягти чогось подібного.