Почему приходит лишь часть файла?
Есть код скачивания файла:
QNetworkAccessManager nam;
nam.setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
QNetworkRequest req(QUrl("https://slimpage.ru/DWAKU2_updater.php"));
req.setRawHeader("Content-Type","multipart/form-data; boundary=margin");
QByteArray data = ("--margin\r\n");
data.append("Content-Disposition: form-data; name=\"download_latest\"\r\n\r\n\r\n");
data.append("--margin--\r\n");
QNetworkReply *reply = nam.post(req, data);
QEventLoop loop;
QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
QObject::connect(&nam, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
if (!reply->isFinished()) loop.exec();
QSaveFile file(QCoreApplication::applicationDirPath() + QDir::separator() + "latest_DWAKU2.exe");
file.open(QIODevice::WriteOnly);
qDebug() << reply->size();
file.write(reply->readAll());
file.commit();
nam.deleteLater();
delete reply;
Есть код PHP:
<?php
$dir = '/SlimPage/www/DWAKU2';
function file_force_download($file) {
if (file_exists($file)) {
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!
if (ob_get_level()) {
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// читаем файл и отправляем его пользователю
readfile($file);
}
}
// GET запросы
if (!empty($_GET)) {
// Проверка доступности сервера
if(isset($_GET['ping'])) {
echo 'pong';
exit;
} else
// Получить версию для обновления
if(isset($_GET['get_latest_version'])) {
$files = array();
foreach(glob($dir . '/*') as $file) {
if (is_file($file)) {
if (pathinfo($file, PATHINFO_EXTENSION) == 'exe')
$files[] = basename(pathinfo($file, PATHINFO_FILENAME));
}
}
echo array_pop($files);
exit;
}
}
// POST запросы
if (!empty($_POST)) {
// Загрузка новой версии
if(isset($_POST['download_latest'])) {
$files = array();
foreach(glob($dir . '/*') as $file) {
if (is_file($file)) {
if (pathinfo($file, PATHINFO_EXTENSION) == 'exe')
$files[] = $file;
}
}
file_force_download(array_pop($files));
exit;
}
}
?>
Файл размером 6.03 Mb, а скачивается по POST запросу всего 48 Kb
Можете подсказать, как это исправить?
Ответы (1 шт):
Автор решения: Alrott SlimRG
→ Ссылка
Как видим, файл большой.
Сервер передает его частями, а QReply получает его частями.
Важно заметить, что isFinished() наступает, когда получена первая часть.
Вот и получаем, что скачивается только первая часть, отданная сервером.
Чтобы получить весь файл - нам нужно или скачивать по частям, сверяя полученный размер байтов с итоговым, или сделать проверку на получение всего файла:
while (reply->isRunning()) loop.exec();