Я написал небольшой скрипт, использующий только PHP, чтобы проверить функциональность загрузки файлов с помощью экспериментального API, где это работало нормально. Когда я решил зафиксировать этот код в своем проекте, я добавил тот же код в обработчик для моего вызова AJAX, однако он не запускает загрузку, как это было раньше.
Я полагаю, что это связано с тем, что я использую AJAX, однако, поскольку я использовал header (), чтобы инициировать загрузку файлов на клиенте, я не знаю, как обойти это.
Кто-нибудь может предложить альтернативный способ сделать это сейчас?
AJAX:
$.ajax({
type: "POST",
url: "handler.php",
data: { 'action': 'downloadFile', 'filename': curSelectedFile },
dataType: 'json',
success: function(data)
{
//Success
}
});
PHP обработчик:
case "downloadFile":
{
$filename = '';
if (isset($_POST["filename"]))
{
$filename = $_POST["filename"];
}
$pos = 0; // Position in file to start reading from
$len = 32; // Length of bytes to read each iteration
$count = 0; // Counter for the number of bytes in the file
do
{
$result = $fm->getFileChunk($filename, $pos, $len);
$chunk = $result->result;
if (!empty($chunk))
{
$chunk = base64_decode($chunk);
$count += strlen($chunk);
echo $chunk;
}
$pos += $len;
}
while (!empty($chunk));
header('Content-Disposition: attachment; filename="'. $filename .'"');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $count);
$response['status'] = "success";
echo json_encode($response);
break;
}
Вы можете закодировать ваш файл в base64 и создать объект File, используя JavaScript.
Я не рекомендовал бы это для больших файлов!
Альтернатива:
Сохраните ваш файл на сервере, и вы можете просто получить местоположение файла и перенаправить с помощью location.href
в обратном вызове Ajax.
Вы можете декодировать base64 используя atob()
и создать типизированный массив. обратитесь к следующему ссылка на сайт для создания Бинарный объект на стороне клиента. Вы создаете типизированный массив как ответили Вот.
Других решений пока нет …