void HttpClientPrivate::uploadqiniu(HttpClientPrivate* d, const QString& path, const QByteArray& data) { HttpClientPrivateCache cache = d->cache(); QFileInfo fileInfo(path); QString filename = fileInfo.fileName(); QFile* file = new QFile(fileInfo.filePath()); if (!file->open(QIODevice::ReadOnly)) { file->close(); qDebug() << "Open file failed: %1" << filename << file->errorString(); delete file; return; } QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QVariantMap map; //指定存储位置 //文件名称 QDateTime currentDateTime = QDateTime::currentDateTime(); currentDateTime = currentDateTime.addSecs(3600); quint32 deadline = currentDateTime.toSecsSinceEpoch(); map.insert("scope", QString("yingkedataf")); map.insert("deadline", deadline); map.insert("saveKey", QString("uploads/template/" + filename)); QJsonDocument jsonDocument = QJsonDocument::fromVariant(map); QString putPolicy = jsonDocument.toJson(); QByteArray encodedPutPolicy = putPolicy.toUtf8().toBase64(); QString ak = "xxxx"; QString sk = "xxxx"; QByteArray encodedSign = HttpClientPrivate::hmacSha1(sk.toUtf8(), encodedPutPolicy); QByteArray token = ak.toUtf8() + ':' + encodedSign + ':' + encodedPutPolicy; //qDebug() << __FUNCTION__ << __LINE__ << "token:" << QString::fromUtf8(token); QHttpPart textPart; textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"token\"")); textPart.setBody(token.replace("+", "-").replace("/", "_")); multiPart->append(textPart); QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"file\"")); filePart.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); filePart.setBodyDevice(file); file->setParent(multiPart); // 现在不能删除文件,所以用 multiPart 删除 multiPart->append(filePart); QNetworkRequest request = HttpClientPrivate::createRequest(d, HttpClientRequestMethod::UPLOAD); // [4] 创建请求需要的变量,执行请求 QNetworkReply* reply = cache.manager->post(request, multiPart); // [5] 请求结束时释放 multiPart 和文件,获取响应数据,在 handleFinish 中执行回调函数 QObject::connect(reply, &QNetworkReply::finished, [=] { multiPart->deleteLater(); // 释放资源: multiPart + file QString successMessage = HttpClientPrivate::readReply(reply, cache.charset); // 请求结束时一次性读取所有响应数据 //qDebug() << successMessage; QString failMessage = reply->errorString(); //qDebug() << failMessage; HttpClientPrivate::handleFinish(cache, reply, successMessage, failMessage); });}