基本框架完成,完善一下细节,最好能完成批量上传

This commit is contained in:
2025-03-24 18:43:22 +08:00
parent d20d1907ca
commit cc7c995549
13 changed files with 798 additions and 99 deletions

View File

@@ -46,6 +46,7 @@ void TCHttpService::apiLogin()
void TCHttpService::apiMyfileCount()
{
QString urlStr;
if (m_enableSsl)
urlStr = "https://" + m_domain + "/api/myfiles";
@@ -77,7 +78,7 @@ void TCHttpService::apiMyfileCount()
});
}
void TCHttpService::apiMyfileNormal()
void TCHttpService::apiMyfileNormal(int start, int count)
{
QString urlStr;
if (m_enableSsl)
@@ -100,16 +101,15 @@ void TCHttpService::apiMyfileNormal()
QJsonObject jsonObj;
jsonObj["token"] = m_token;
jsonObj["user"] = m_userName;
jsonObj["count"] = m_total;
jsonObj["start"] = 0;
jsonObj["count"] = count;
jsonObj["start"] = start;
QJsonDocument jsonDoc(jsonObj);
QByteArray jsonData = jsonDoc.toJson();
QNetworkReply* reply = nullptr;
reply = m_manager.post(request, jsonData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply](){
connect(reply, &QNetworkReply::finished, [this, reply](){
emit requestFinished(reply, "myfilenormal");
});
}
@@ -137,73 +137,112 @@ void TCHttpService::apiMd5(const QString& filePath)
QMap<QString, QString> headers;
headers.insert("Content-Type", "application/json");
QString md5Str = QString::fromUtf8(fileMd5);
QString bodyStr = QString("\"%1\":\"%2\",\"%3\":\"%4\",\"%5\":\"%6\",\"%7\":\"%8\"").arg("token").arg(m_token).
arg("md5").arg(md5Str).arg("filename").arg(QFileInfo(file).fileName()).arg("user").arg(m_userName);
QJsonObject jsonObj;
jsonObj["token"] = m_token;
jsonObj["md5"] = md5Str;
jsonObj["filename"] = QFileInfo(file).fileName();
jsonObj["user"] = m_userName;
file.close();
QJsonDocument jsonDoc(jsonObj);
QByteArray jsonData = jsonDoc.toJson();
QNetworkReply* reply = nullptr;
QNetworkRequest request(urlStr);
reply = m_manager.post(request, jsonData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply](){
emit requestFinished(reply, "md5");
});
}
void TCHttpService::apiUpload(const QString &filePath, const QString &md5Str)
void TCHttpService::apiUpload(const QString &filePath)
{
QString urlStr;
if (m_enableSsl)
urlStr = "https://" + m_domain + "/api/upload";
else
urlStr = "http://" + m_domain + "/api/upload";
QFile file(filePath);
QFileInfo info(file);
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart filePart;
QString contentTypeStrFile = QString("form-data; name=\"file\"; filename=\"%1\"").arg(info.fileName());
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant(contentTypeStrFile));
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
if (!file.open(QIODevice::ReadOnly)) {
QFile *file = new QFile(filePath);
if (!file->open(QIODevice::ReadOnly)) {
qDebug() << "无法打开文件:" << filePath;
delete file;
return;
}
filePart.setBodyDevice(&file);
file.setParent(multiPart);
// 计算文件 MD5
QCryptographicHash hash(QCryptographicHash::Md5);
hash.addData(file);
QString md5 = hash.result().toHex();
// 重置文件指针
file->seek(0);
// 获取文件大小
qint64 fileSize = file->size();
// 创建 multipart 请求
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
#else
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormData);
#endif
// 添加文件部分
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name=\"file\"; filename=\"" + QFileInfo(filePath).fileName() + "\""));
filePart.setBodyDevice(file);
multiPart->append(filePart);
// 添加用户信息部分
QHttpPart userPart;
QString contentTypeStrUser = QString("form-data; name=\"user\"");
userPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(contentTypeStrUser));
userPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"user\""));
userPart.setBody(m_userName.toUtf8());
multiPart->append(userPart);
// 添加 MD5 部分
QHttpPart md5Part;
QString contentTypeStrMd5 = QString("form-data; name=\"md5\"");
md5Part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentTypeStrMd5));
md5Part.setBody(md5Str.toUtf8());
md5Part.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"md5\""));
md5Part.setBody(md5.toUtf8());
multiPart->append(md5Part);
// 添加文件大小部分
QHttpPart sizePart;
QString contentTypeStrSize = QString("form-data; name=\"size\"");
sizePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentTypeStrSize));
sizePart.setBody(QString::number(info.size()).toUtf8());
sizePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"size\""));
sizePart.setBody(QString::number(fileSize).toUtf8());
multiPart->append(sizePart);
QUrl url(urlStr);
QNetworkRequest request(url);
// 创建网络请求
QNetworkRequest request(urlStr); // 替换为实际的服务器地址
request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + multiPart->boundary());
QNetworkReply* reply = m_manager.post(request, multiPart);
multiPart->setParent(reply);
// 发送请求
// QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply = m_manager.post(request, multiPart);
QObject::connect(reply, &QNetworkReply::finished, [this, reply]{
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code == 0) {
emit signal_uploadSuc();
// 连接信号槽
connect(reply, &QNetworkReply::finished, this, [=]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "上传成功:";
apiMyfileCount();
} else {
qDebug() << "上传失败:" << reply->errorString();
}
reply->deleteLater();
multiPart->deleteLater();
});
connect(reply, &QNetworkReply::uploadProgress, this, [](qint64 bytesSent, qint64 bytesTotal) {
if (bytesTotal > 0) {
int progress = (bytesSent * 100) / bytesTotal;
qDebug() << "上传进度:" << progress << "%";
}
});
}
void TCHttpService::apiSharePicShare(const QString &fileName, const QString &md5)
@@ -230,7 +269,6 @@ void TCHttpService::apiSharePicShare(const QString &fileName, const QString &md5
void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString domain)
{
qDebug() << "setConfiguration";
this->m_domain = domain;
this->m_userName = userName;
this->m_firstPwd = firstPwd;
@@ -246,6 +284,9 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
if (code == 0) {
this->m_token = jsonObj["token"].toString();
qDebug() << this->m_token;
this->m_isOnline = true;
apiMyfileCount();
}
}
if (api == "myfilecount") {
@@ -258,11 +299,65 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
if (code == 0) {
int total = jsonObj["total"].toInt();
this->m_total = total;
int n = total / 10 + 1;
for (int i = 0; i < n; i++) {
//0 10 20
int count = (total - i * 10 >= 10) ? 10 : (total - i * 10);
apiMyfileNormal(i*10, count);
}
}
}
if (api == "myfilenormal") {
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code != 0)
return;
QJsonArray jsonArray = jsonObj["files"].toArray();
for (const QJsonValue& value : jsonArray) {
QJsonObject jsonObj = value.toObject();
QString file_name = jsonObj["file_name"].toString();
int share_status = jsonObj["share_status"].toInt();
QString url = jsonObj["url"].toString();
qint64 size = jsonObj["size"].toInt();
QString md5 = jsonObj["md5"].toString();
QMap<QString, file_info_t>::iterator ite;
ite = m_fileMap.find(file_name);
if (ite == m_fileMap.end()) {
file_info_t info;
info.share_status = share_status;
info.size = size;
info.url = url;
info.file_name = file_name;
emit signal_uploadFileSec(url);
m_fileMap.insert(md5, info);
}
#if !DEBUG
// for(auto ite = m_fileMap.constBegin(); ite != m_fileMap.constEnd(); ite++) {
// qDebug() << "fileMap debug:" << ite.value().file_name;
// }
qDebug() << "fileMap size:" << m_fileMap.size();
#endif
}
}
// if (api == "upload") {
// qDebug() <<"upload";
// QJsonDocument jsondoc = QJsonDocument::fromJson(rawData);
// QJsonObject jsonObj = jsondoc.object();
// int code = jsonObj["code"].toInt();
// if (code == 0)
// this->apiMyfileCount();
// }
reply->deleteLater();
});
apiLogin();
@@ -270,10 +365,19 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
void TCHttpService::setSsl(bool enable)
{
qDebug() << "setSsl:" <<enable;
this->m_enableSsl = enable;
}
bool TCHttpService::getOnlineState()
{
return m_isOnline;
}
void TCHttpService::setUploadNum(int nb)
{
this->m_uploadNum = nb;
}
QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
{
QUrlQuery query;
@@ -290,14 +394,14 @@ QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
void TCHttpService::updateFileMap(QJsonObject jsonObj)
{
QString fileMD5 = jsonObj["md5"].toString();
QString fileUrl = jsonObj["http"].toString();
// QString fileMD5 = jsonObj["md5"].toString();
// QString fileUrl = jsonObj["http"].toString();
QMap<QString, QString>::iterator ite = m_fileMap.begin();
if (ite != m_fileMap.end())
return;
// QMap<QString, file_info_t>::iterator ite = m_fileMap.begin();
// if (ite != m_fileMap.end())
// return;
m_fileMap.insert(fileMD5, fileUrl);
// m_fileMap.insert(fileMD5, fileUrl);
}
TCHttpService::TCHttpService(QObject *parent) : QObject(parent)

View File

@@ -1,6 +1,8 @@
#ifndef TCHTTPSERVICE_H
#define TCHTTPSERVICE_H
#define DEBUG 1
#include <QObject>
#include <QNetworkAccessManager>
#include <QUrlQuery>
@@ -14,21 +16,33 @@
#include <QFileInfo>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QHttpMultiPart>
class TCHttpService : public QObject
{
Q_OBJECT
private:
typedef struct {
QString file_name;
int share_status;
QString url;
qint64 size;
} file_info_t;
QMap<QString, file_info_t> m_fileMap;
public:
static TCHttpService* getInstance();
void apiLogin();
void apiMyfileCount();
void apiMyfileNormal();
void apiMyfileNormal(int start, int count);
void apiMd5(const QString& filePath);
void apiUpload(const QString& filePath, const QString& md5);
void apiUpload(const QString& filePath);
void apiSharePicShare(const QString& fileName, const QString& md5);
void setConfiguration(QString userName, QString firstPwd, QString domain);
void setSsl(bool enable);
bool getOnlineState();
void setUploadNum(int nb);
private:
@@ -38,7 +52,7 @@ signals:
void signal_loginSuc();
void signal_uploadSuc();
void signal_shareSuc();
void signal_uploadFileSec(QString url);
void requestFinished(QNetworkReply* reply, QString api);
private:
explicit TCHttpService(QObject *parent = nullptr);
@@ -51,10 +65,13 @@ private:
QString m_domain;
QString m_firstPwd;
QString m_userName;
QMap<QString, QString> m_fileMap;
int m_total;
bool m_enableSsl = true;
bool m_isOnline = false;
bool m_uploadNum = 0;
signals:
};