sever代码
//启动HTTP服务
void Sever::start()
{
QHttpServer *server = new QHttpServer(this);
server->route("/", []() {
return "http server";
});
// 下载(支持断点续传,由QHttpServerResponse::fromFile改写)
server->route("/download/<arg>", [](const QUrl &url,const QHttpServerRequest &request) {
QString path = QStringLiteral("%1/assets/%2").arg(QCoreApplication::applicationDirPath()).arg(url.path());
QFile file(path);
if (!file.open(QFile::ReadOnly))
return QHttpServerResponse(QHttpServerResponder::StatusCode::NotFound);
// 找寻头中断点参数
QVariantMap map = request.headers();
QVariantMap::Iterator it = map.find("Range");
QByteArray data;
// 存在断点从断点获取断点后数据(依据http协议中断点定义)
if(it != map.end())
{
QVariant value = it.value();
QStringList strList = value.toString().split("-");
QString str1 = strList.at(0);
QRegExp rx("\\d+");
rx.indexIn(str1, 0);
int seek = rx.cap(0).toInt();
if (seek != 0)
file.seek(seek);
QString str2 = strList.at(1);
int len = str2.toInt();
if (len == 0 || len < seek)
len = file.size();
data = file.read(len - seek);
}
else
{
data = file.readAll();
}
file.close();
const QByteArray mimeType = QMimeDatabase().mimeTypeForFileNameAndData(path , data).name().toLocal8Bit();
return QHttpServerResponse(mimeType, data);
});
// 上传
server->route("/upload/<arg>", [=](QString name, const QHttpServerRequest &request) {
if(!name.isEmpty() && !request.body().isEmpty())
{
// 文件存储路径
QString path = QString("%1/assets/%2").arg(QCoreApplication::applicationDirPath()).arg(name);
QFile file(QDir::toNativeSeparators(path));
// 写入文件
if(file.open(QIODevice::WriteOnly))
{
file.write(request.body());
file.close();
}
}
});
// 开始监听端口57508
server->listen(QHostAddress::Any, 57508);
}
client代码
// 上传文件
void Client::upload()
{
QString path = "D:/test.txt";
QFile *file = new QFile(path);
if(file->open(QIODevice::ReadOnly))
{
// 构建请求
QNetworkRequest request(QString("http://127.0.0.1:57508/upload/%1").arg(QFileInfo(path).fileName()));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/stream");
// 发送请求,通过post传递文件
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply = manager->post(request, file->readAll());
connect(reply, &QNetworkReply::finished, this, [] {
qInfo() << "上传成功";
file->close();
reply->deleteLater();
});
}
}
// 下载文件
void Client::download()
{
// 构建请求
QNetworkRequest request(QString("http://127.0.0.1:57508/download/test"));
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/stream"));
// 发送请求,通过get获取文件
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, [reply] {
QString path = "D:/test.txt";
QFile *file = new QFile(path);
if(file->open(QIODevice::WriteOnly))
{
file->write(reply->readAll());
file->close();
reply->deleteLater();
}
});
}