1. void HttpClientPrivate::uploadqiniu(HttpClientPrivate* d, const QString& path, const QByteArray& data) {
    2. HttpClientPrivateCache cache = d->cache();
    3. QFileInfo fileInfo(path);
    4. QString filename = fileInfo.fileName();
    5. QFile* file = new QFile(fileInfo.filePath());
    6. if (!file->open(QIODevice::ReadOnly)) {
    7. file->close();
    8. qDebug() << "Open file failed: %1" << filename << file->errorString();
    9. delete file;
    10. return;
    11. }
    12. QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    13. QVariantMap map;
    14. //指定存储位置
    15. //文件名称
    16. QDateTime currentDateTime = QDateTime::currentDateTime();
    17. currentDateTime = currentDateTime.addSecs(3600);
    18. quint32 deadline = currentDateTime.toSecsSinceEpoch();
    19. map.insert("scope", QString("yingkedataf"));
    20. map.insert("deadline", deadline);
    21. map.insert("saveKey", QString("uploads/template/" + filename));
    22. QJsonDocument jsonDocument = QJsonDocument::fromVariant(map);
    23. QString putPolicy = jsonDocument.toJson();
    24. QByteArray encodedPutPolicy = putPolicy.toUtf8().toBase64();
    25. QString ak = "xxxx";
    26. QString sk = "xxxx";
    27. QByteArray encodedSign = HttpClientPrivate::hmacSha1(sk.toUtf8(), encodedPutPolicy);
    28. QByteArray token = ak.toUtf8() + ':' + encodedSign + ':' + encodedPutPolicy;
    29. //qDebug() << __FUNCTION__ << __LINE__ << "token:" << QString::fromUtf8(token);
    30. QHttpPart textPart;
    31. textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"token\""));
    32. textPart.setBody(token.replace("+", "-").replace("/", "_"));
    33. multiPart->append(textPart);
    34. QHttpPart filePart;
    35. filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"file\""));
    36. filePart.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
    37. filePart.setBodyDevice(file);
    38. file->setParent(multiPart); // 现在不能删除文件,所以用 multiPart 删除
    39. multiPart->append(filePart);
    40. QNetworkRequest request = HttpClientPrivate::createRequest(d, HttpClientRequestMethod::UPLOAD);
    41. // [4] 创建请求需要的变量,执行请求
    42. QNetworkReply* reply = cache.manager->post(request, multiPart);
    43. // [5] 请求结束时释放 multiPart 和文件,获取响应数据,在 handleFinish 中执行回调函数
    44. QObject::connect(reply, &QNetworkReply::finished, [=] {
    45. multiPart->deleteLater(); // 释放资源: multiPart + file
    46. QString successMessage = HttpClientPrivate::readReply(reply, cache.charset); // 请求结束时一次性读取所有响应数据
    47. //qDebug() << successMessage;
    48. QString failMessage = reply->errorString();
    49. //qDebug() << failMessage;
    50. HttpClientPrivate::handleFinish(cache, reply, successMessage, failMessage);
    51. });
    52. }