2014-03-19 2 views
-1

사람이 나를 QT/C++이미지 업로드 Qt는/C++

여기에 내 코드를 사용하여 푸른 스토리지에 이미지를 업로드하는 데 도움이 될 수 있습니다. 가. 헤더를 구성에 오류를 가지고 *

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("PUT\n\n\n%1\n\n\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:%2\nx-ms-version:2013-08-15\n/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 서버가 요청을 인증하지 못했습니다 요청에 대한 응답이다. 인증 헤더의 값이 서명을 포함하여 올바르게 형성되었는지 확인하십시오. RequestId : 82eb03cb-adf1-4797-bbc0-86c3e5ca3ec6 시간 : 2014-03-19T03 : 52 : 35.4790761Z HTTP 요청 '3Dk7laN3XW + ASbQj0XddfmSnnuYfVSkhg/oRfSJekKY ='에서 발견 된 MAC 서명이 계산 된 서명과 동일하지 않습니다. 문자열을 다음 사용하는 서버에 서명하기 : 'POST를

87,163

응용 프로그램/octet-stream을

X-MS-방울 형 : BlockBlob에게 X-MS-날짜 : 2014년 3월 19일 (수) 11 : 52:05 GMT x-ms-version : 2013-08-15 /logboxstorage/mycontainer/todate '입니다.

모든 도움을 주실 수 있습니다. 감사합니다!

답변

0

다음 코드 줄을 보면 :

QString header = QString("PUT\n\n\n%1\n\n\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:%2\nx-ms-version:2013-08-15\n/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 요청이어야합니다.

+0

도움 주셔서 감사합니다. 하지만 결과는 여전히 동일합니다 –

+0

내 대답이 업데이트되었습니다. –

+0

datetime은 현재 다른 형식의 코드에서 컨테이너 목록을 가져 왔기 때문에이 형식의 현재 날짜 인 경우 유효합니다 (Wed, 19 Mar 2014 13:58:20 GMT). 문제는 요청으로 이미지를 업로드하는 방법을 알지 못합니다. 도움에 감사드립니다. –