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);
});
}