2016-07-22 3 views
0

Notre application a besoin de télécharger le blob avec la taille 0. Nous utilisons cURL pour appeler l'API REST Azure storage. Bien que le téléchargement de la taille, il échoue avec HTTP code d'erreur [400]Azure blob storage: Impossible de télécharger le blob avec la taille 0

message d'erreur suivant son retour


<?xml version="1.0" encoding="utf-8"?> 
    <Error> 
      <Code>InvalidHeaderValue</Code> 
      <Message> 
        The value for one of the HTTP headers 
        is not in the correct format. 
        RequestId:2b1ec18b-0001-007d-7811-e40725000000 
        Time:2016-07-22T12:07:28.5435467Z 
      </Message> 
      <HeaderName>Content-Length</HeaderName> 
      <HeaderValue>-1</HeaderValue> 
      </Error> 

Grâce Wireshark, nous nous sommes assurés que la valeur de la longueur du contenu l'en-tête est envoyé correctement.

Voici les en-têtes capturés de Wireshark


PUT /test/DC70439C-5004-11E6-B4B2-91D87435845D HTTP/1.1 
Host: mytest.blob.core.windows.net 
Accept: */* 
Transfer-Encoding: chunked 
x-ms-blob-type:BlockBlob 
x-ms-version:2015-02-21 
Content-Length:0 
x-ms-date:Fri, 22 Jul 2016 12:07:28 GMT 
Authorization:SharedKey kanchan:HQQ7a47TPQtEhL0ek6rim64ZKC8NRubgKuq+4Os+Aoo= 
Expect: 100-continue 

Pouvez-vous aider plese à comprendre pourquoi la valeur d'en-tête de longueur du contenu a été défini comme -1?

Merci et salutations, Rahul Naik

+0

Suite est la chaîne à signe utilisé pour générer en-tête d'autorisation PUT x-ms-blob type: BlockBlob x-ms-jour: Ven, 22 Juil 2016 12:07:28 GMT Version x-ms: 2015-02-21 /test/test/DC70439C-5004-11E Comme nous utilisons la version 2015-02-21, nous nous sommes assurés qu'il n'y a pas d'en-tête de contenu ajouté dans stringToSign, si sa longueur est 0. –

Répondre

0

Je n'ai pas reproduit votre problème. Ce qui suit est mon code testé en utilisant cURL pour télécharger le fichier vers le stockage blob Azure. Cela fonctionne de mon côté, et je peux télécharger un fichier de taille 0 (définir le contenu du fichier comme ""). J'espère que cela pourrait vous donner quelques conseils.

storage_account="<account name>" 
container_name="<container name>" 
access_key="<account key>" 
content="<file content>" 
len=${#content} 
blobname="<blob name>" 
blob_store_url="blob.core.windows.net" 
authorization="SharedKey" 
request_method="PUT" 
request_date=$(TZ=GMT date "+%a, %d %h %Y %H:%M:%S %Z") 
storage_service_version="2011-08-18" 
# HTTP Request headers 
x_ms_date_h="x-ms-date:$request_date" 
x_ms_version_h="x-ms-version:$storage_service_version" 
# Build the signature string 
canonicalized_headers="x-ms-blob-type:BlockBlob\n${x_ms_date_h}\n${x_ms_version_h}" 
canonicalized_resource="/${storage_account}/${container_name}/${blobname}" 
string_to_sign="${request_method}\n\n\n${len}\n\napplication/x-www-form-urlencoded\n\n\n\n\n\n\n${canonicalized_headers}\n${canonicalized_resource}" 
# Decode the Base64 encoded access key, convert to Hex. 
decoded_hex_key="$(echo -n $access_key | base64 -d -w0 | xxd -p -c256)" 
signature=$(printf "$string_to_sign" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:$decoded_hex_key" -binary | base64 -w0) 
authorization_header="Authorization: $authorization $storage_account:$signature" 


curl \ 
    -X PUT \ 
    -H "$x_ms_date_h" \ 
    -H "$x_ms_version_h" \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -H "$authorization_header" \ 
    -H "x-ms-blob-type:BlockBlob" \ 
    -d ${content} "https://${storage_account}.${blob_store_url}/${container_name}/${blobname}" 
0

Il semble "kanchan" est correspondent pas "mytest". nous pourrions trouver cette information à ce lien: https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx.

Authorization:SharedKey kanchan:HQQ7a47TPQtEhL0ek6rim64ZKC8NRubgKuq+4Os+Aoo= 

D'après le document que nous pourrions constater que "kanchan" est le nom du compte. Cependant, l'information hôte "mytest.blob.core.windows.net" montre "mytest". Peut-être que c'est le problème.

+0

Désolé C'est mon mauvais. Kanchan est le nom du compte. Avant de poster cette question, j'ai essayé de remplacer kancahn par mytest mais celui-ci est manqué. –