有人能帮我使用qt/c++将图像上传到azure存储吗
这是我的密码。它似乎在构造标头时出错*
QByteArray data;
QFile file("Bg.jpg");
if (file.open(QIODevice::ReadOnly))
{
data.append(file.readAll()); //let's read the file
}
QString date = QDateTime::currentDateTime().toString("ddd, d MMM yyyy HH:mm:ss") + " GMT";
QString header = QString("PUTnnn%1nnnnnnnnnx-ms-blob-type:BlockBlobnx-ms-date:%2nx-ms-version:2013-08-15n/mycontainer/todate/").arg(data.length()).arg(date);
QString urlUri = "http://myaccount.blob.core.windows.net/mycontainer/todate";
QByteArray ba = header.toUtf8();
unsigned char* signature = reinterpret_cast<unsigned char*>(ba.data());
QByteArray kba =
QByteArray::fromBase64("key");
unsigned char* key = (unsigned char*) kba.data();
unsigned char result[EVP_MAX_MD_SIZE];
unsigned int result_len;
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, strlen((const char*)key), EVP_sha256(), NULL);
HMAC_Update(&ctx, signature, strlen((const char*)signature));
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
QByteArray array = QByteArray::fromRawData((char*)result, result_len);
array = array.toBase64();
String version = "2013-08-15";
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl(urlUri));
request.setRawHeader("Content- Length",QString::number(data.length()).toStdString().c_str());
request.setRawHeader("Content-Type","application/octet-stream");
request.setRawHeader("x-ms-blob-type","BlockBlob");
request.setRawHeader("x-ms-date", date.toStdString().c_str());
request.setRawHeader("x-ms-version", version.toStdString().c_str());
request.setRawHeader("Authorization","SharedKey myaccount:"+array);
manager->post(request,data);
connect(manager, SIGNAL(finished(QNetworkReply*)), this,SLOT(manageCloudReply(QNetworkReply*)));
这是对请求的响应
ȕ?AuthenticationFailed
服务器无法对请求进行身份验证。确保Authorization标头的值格式正确,包括签名。请求ID:82eb03cb-adf1-4797-bbc0-86c3e5ca3ec6时间:2014-03-19T03:52:35.4790761Z在HTTP请求"3Dk7laN3XW+ASbQj0XddfmSnnuYfVSkhg/oRfSJekKY="中发现的MAC签名与任何计算签名都不相同。服务器使用以下字符串进行签名:"POST
87163
应用程序/八位字节流
x-ms-blob类型:BlockBlobx-ms-日期:2014年3月19日星期三11:52:05 GMTx-ms版本:2013-08-15/logboxstorage/mycontainer/todate'。
任何帮助都将不胜感激。。谢谢
查看以下代码行:
QString header = QString("PUTnnn%1nnnnnnnnnx-ms-blob-type:BlockBlobnx-ms-date:%2nx-ms-version:2013-08-15n/mycontainer/todate/").arg(data.length()).arg(date);
我在mycontainer/todate/
中看到一个额外的斜线(/
(。你能试着把它去掉吗?
另请查看以下代码:
QString date = QDateTime::currentDateTime().toString("ddd, d MMM yyyy HH:mm:ss") + " GMT";
currentDateTime()
将根据您的计算机返回本地日期/时间。应为UTC/GMT
日期/时间。尝试使用currentDateTimeUtc()
。
我注意到的另一件事是,您的请求以POST
的形式发送到服务器。它应该是PUT
请求。