Я вижу, вы уже нашли решение, однако я просто хотел добавить некоторую информацию, которая может помочь кому-то, пытающемуся достичь того же самого с большими запросами POST.
У меня была такая же проблема пару недель назад, действительно, невозможно добиться "чистой" загрузки через AJAX, Filament Group создала плагин jQuery, который работает точно так, как вы уже узнали, он называется jQuery File Скачать, однако, есть и обратная сторона этой техники.
Если вы отправляете большие запросы через AJAX (скажем, файлы + 1 МБ), это отрицательно скажется на скорости отклика. В медленных подключениях к Интернету , вам придется ждать много , пока запрос не посылаются , а также ждать файл для загрузки. Это не похоже на мгновенный щелчок "=" "всплывающее окно" => "начало загрузки". Это больше похоже на «щелчок» => «ожидание отправки данных» => «ожидание ответа» => «запуск загрузки», при котором файл выглядит в два раза больше, потому что вам придется ждать отправки запроса через AJAX и вернуть его в виде загружаемого файла.
Если вы работаете с файлами небольшого размера <1 МБ, вы этого не заметите. Но, как я обнаружил в своем собственном приложении, для файлов большего размера это практически невыносимо.
Мое приложение позволяет пользователям экспортировать изображения, сгенерированные динамически, эти изображения отправляются через POST-запросы в формате base64 на сервер (это единственный возможный способ), затем обрабатываются и отправляются пользователям в виде файлов .png, .jpg, base64. Строки для изображений + 1 МБ огромны, это заставляет пользователей ждать больше, чем необходимо, чтобы файл начал загружаться. В медленных интернет-соединениях это может быть действительно раздражающим.
Мое решение для этого состояло в том, чтобы временно записать файл на сервер, когда он будет готов, динамически сгенерировать ссылку на файл в виде кнопки, которая изменяется между состояниями «Пожалуйста, подождите ...» и «Загрузить» и одновременно распечатайте изображение base64 во всплывающем окне предварительного просмотра, чтобы пользователи могли «щелкнуть правой кнопкой мыши» и сохранить его. Это делает все время ожидания более терпимым для пользователей, а также ускоряет процесс.
Обновление 30 сентября 2014 г .:
С тех пор, как я это опубликовал, прошли месяцы, и, наконец, я нашел лучший подход для ускорения работы с большими строками base64. Теперь я сохраняю строки base64 в базе данных (используя поля longtext или longblog), затем я передаю его идентификатор записи через jQuery File Download, наконец, в файле сценария загрузки, я запрашиваю базу данных, используя этот идентификатор, чтобы извлечь строку 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», которые не дали мне ответ, который я искал, я надеюсь, что эта информация поможет кому-то, стремящемуся достичь чего-то подобного.