2015-04-22 90 views
0

我閱讀並實現了以下文章,用於在javascript客戶端和azure blob存儲之間分塊文件:http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript。我似乎能夠生成共享訪問簽名並創建權限,但是當我試圖用以下SAS URL將塊「放」到azure時,我收到錯誤:「403(服務器未能驗證請求。確保授權標題的值正確形成,包括簽名。)「。有人可以請我做錯了什麼。這裏的代碼和網址和代碼:403當測試azure Blob存儲上傳時出錯

//sas url that is generated 
http://testing.blob.core.windows.net/image-container?sr=c&si=Perms1&sig=UowbDVCLfFdiVktTZuoupj6BiMUzLRxF3WEZlXKMJcA%3D&comp=block&blockid=YmxvY2stMDAwMDAw 


//Upload the blocks to azure storage 
if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
    var uri = submitUri + '&comp=block&blockid=' + blockIds[blockIds.length - 1]; 
    var requestData = new Uint8Array(evt.target.result); 
    $.ajax({ 
     url: uri, 
     type: "PUT", 
     data: requestData, 
     processData: false, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob'); 
      //xhr.setRequestHeader('Content-Length', requestData.length); 
     }, 
     success: function (data, status) { 
      console.log(data); 
      console.log(status); 
      bytesUploaded += requestData.length; 
      var percentComplete = ((parseFloat(bytesUploaded)/parseFloat(selectedFile.size)) * 100).toFixed(2); 
      $("#fileUploadProgress").text(percentComplete + " %"); 
      uploadFileInBlocks(); 
     }, 
     error: function(xhr, desc, err) { 
      console.log(desc); 
      console.log(err); 
     } 
    }); 
} 


     //Create stored access permissions 
     Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient(); 

     //Get a reference to a container to use for the sample code, and create it if it does not exist. 
     Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer container = blobClient.GetContainerReference("images-container"); 
     container.CreateIfNotExists(); 

     //Create a new stored access policy and define its constraints. 
     Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy sharedPolicy = new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy() 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10), 
      Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Write 
     }; 

     //Get the container's existing permissions. 
     Microsoft.WindowsAzure.Storage.Blob.BlobContainerPermissions permissions = container.GetPermissions(); 

     //Add the new policy to the container's permissions. 
     if (!permissions.SharedAccessPolicies.ContainsKey(CloudConfiguration.GetConfigurationSetting("PolicyName"))) 
     { 
      permissions.SharedAccessPolicies.Clear(); 
      permissions.SharedAccessPolicies.Add(policyName, sharedPolicy); 
      container.SetPermissions(permissions); 
     } 


     //Generate the SAS Locator 
     CreateStoredAccessPolicy(CloudConfiguration.GetConfigurationSetting("PolicyName")); 

     //Create the blob client object. 
     Microsoft.WindowsAzure.StorageClient.CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient(); 

     //Get a reference to a container to use for the sample code, and create it if it does not exist. 
     Microsoft.WindowsAzure.StorageClient.CloudBlobContainer container = blobClient.GetContainerReference("images-container"); 

     //Set the expiry time and permissions for the container. 
     //In this case no start time is specified, so the shared access signature becomes valid immediately. 
     SharedAccessPolicy sasConstraints = new SharedAccessPolicy(); 

     //Generate the shared access signature on the container, setting the constraints directly on the signature. 
     string sasContainerToken = container.GetSharedAccessSignature(sasConstraints, CloudConfiguration.GetConfigurationSetting("PolicyName")); 

     var newFileFile = Guid.NewGuid().ToString() + extension; 
     var blobUri = new UriBuilder(container.AbsoluteUri.ToString() + sasContainerToken); 

     // return the new VideoAsset 
     return new ImageAsset() { SasLocator = blobUri.AbsoluteUri.ToString(), NewFileName = newFileFile }; 

我目前正在我的本地計算機上從天藍色模擬器調試模式下進行測試。不知道這是否是一個因素。

+0

我注意到sas uri中返回的內容。儘管如此,我正在將一個新的blob上傳到系統中,querystring具有「sr = c」而不是「sr = b」。這可能是問題,如果問題出現,我該如何解決? – user1790300

回答

0

即使您嘗試上載塊,生成的URL也會指向容器。它也應該包含一個blob名稱,如http://testing.blob.core.windows.net/image-container/image-blob

+0

因此,也許每個上傳的文件的GUID?讓我嘗試一下。 – user1790300

+0

我追加了我計劃以上傳的名稱命名的文件名,例如http://testing.blob.core.windows.net/images-testing/16c1c835-1367-46ea-a1f3-35944ce735bb.jpg?sr= C&SI = Perms1&SIG = UowbDVCLfFdiVktTZuoupj6BiMUzLRxF3WEZlXKMJcA%3D&排版=塊&塊標識= YmxvY2stMDAwMDAw。嘗試此操作後,我仍然收到相同的錯誤。 – user1790300

+0

您能否更新示例代碼並添加您的更改以添加blob名稱? –

1

在容器上建立存儲訪問策略時,最多可能需要30秒才能生效。在此間隔期間,與存儲的訪問策略關聯的共享訪問簽名將失敗,並顯示狀態碼403(禁止),直到訪問策略激活。有關共享訪問策略的更多信息,請參閱 - https://msdn.microsoft.com/library/azure/dd179391.aspx

因此,請確保您在生成上述正確的URL後,請確保您在使用該策略之前等待30秒。