有一个文件下载代码:
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
你能建议如何解决这个问题吗?
如您所见,该文件很大。
服务器分部分发送,QReply 分部分接收。
重要的是要注意收到第一部分
isFinished()时会发生什么。 所以我们得到只有服务器给出的第一部分被下载。 要获取整个文件 - 我们需要部分下载,将接收到的字节大小与最后一个进行比较,或者检查以获取整个文件: