Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件放入无ContentLength的Azure Blob_Azure_Api_Blob_Put - Fatal编程技术网

将文件放入无ContentLength的Azure Blob

将文件放入无ContentLength的Azure Blob,azure,api,blob,put,Azure,Api,Blob,Put,我在一家公司工作,希望他们能够将一个文件放入我的Azure Blobstorage。我的想法是生成授权标头,并使用RESTAPI将此标头和其他必需的标头传递给他们。然后,他们使用它将文件放入我的Azure容器中 问题是我不知道他们要放的文件的大小。在我所有的研究和Postman测试中,我必须知道文件的大小,以便在创建授权头时设置ContentLength。只有这样,PUT才会成功。我的授权标头采用以下格式: SharedKey storagename:zzzzzzzzzzzzzzzzzzzzzz

我在一家公司工作,希望他们能够将一个文件放入我的Azure Blobstorage。我的想法是生成授权标头,并使用RESTAPI将此标头和其他必需的标头传递给他们。然后,他们使用它将文件放入我的Azure容器中

问题是我不知道他们要放的文件的大小。在我所有的研究和Postman测试中,我必须知道文件的大小,以便在创建授权头时设置ContentLength。只有这样,PUT才会成功。我的授权标头采用以下格式:

SharedKey storagename:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
  • 是否可以在不知道ContentLength的情况下创建授权标头
  • 如果没有,是否有其他方法将文件放入或发布到blob(或者Azure文件,如果这样做更可能成功)

  • 我相信你所想的方法是行不通的

    首先,在计算授权头时,您需要指定内容长度,而您显然不知道授权头的长度

    其次,在计算授权标头时,必须指定当前日期时间(在
    date
    x-ms-date
    标头中)。您将遇到的问题是,如果不立即使用授权标头,您的客户机的请求将被拒绝


    更好的选择是使用with
    Write
    权限。在这里,您不必担心包含内容长度。用户只需使用共享访问签名URL将文件上载到blob容器中。您可能希望为blob容器创建一个SAS URL,您希望用户在其中上载文件。

    我相信您认为的方法行不通

    首先,在计算授权头时,您需要指定内容长度,而您显然不知道授权头的长度

    其次,在计算授权标头时,必须指定当前日期时间(在
    date
    x-ms-date
    标头中)。您将遇到的问题是,如果不立即使用授权标头,您的客户机的请求将被拒绝

    更好的选择是使用with
    Write
    权限。在这里,您不必担心包含内容长度。用户只需使用共享访问签名URL将文件上载到blob容器中。您需要为blob容器创建一个SAS URL,您希望您的用户在其中上载文件。

    正如@GuaravMantri所说(正如我所怀疑的),在使用授权头创建文件时,内容长度是必不可少的,该授权头将用于使用共享密钥放置文件。我还没有想到他提到的第二个问题,即链接在使用前会过期

    下面是我在C#中使用共享访问签名生成url的步骤:

            string blobName = $"TestFile.txt";
            string storageAccountName = "aaaaaaaa";
            string containerName = "ccccccccc";
            string key = "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk==";
    
            string connectionString = $"DefaultEndpointsProtocol=https;AccountName={storageAccountName};AccountKey={key}";
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
            BlobClient blob = containerClient.GetBlobClient(blobName);
    
            var sasBuilder = new Azure.Storage.Sas.BlobSasBuilder()
            {
                BlobContainerName = containerName,
                BlobName = blobName,
                Resource = "b",  
                StartsOn = DateTime.UtcNow.AddMinutes(-5),
                ExpiresOn = DateTime.UtcNow.AddMinutes(120)
            };
            sasBuilder.SetPermissions(Azure.Storage.Sas.BlobSasPermissions.Create);
    
            StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, key);
            BlobSasQueryParameters sasQueryParameters = sasBuilder.ToSasQueryParameters(storageSharedKeyCredential);
    
            UriBuilder fullUri = new UriBuilder()
            {
                Scheme = "https",
                Host = string.Format($"{storageAccountName}.blob.core.windows.net"),
                Path = string.Format($"{containerName}/{blobName}"),
                Query = sasQueryParameters.ToString()
            };
    
            BlobClient blobClient = new BlobClient(fullUri.Uri, null);
    
            string uriToUseInPostman = fullUri.Uri.ToString();
    
    我用邮递员来测试这一点:

    注意,我必须设置x-ms-blob-type。如果没有这个头,上传就会失败。

    正如@GuaravMantri所说(我怀疑也是如此),在使用授权头创建文件时,内容长度是至关重要的,该授权头将用于使用SharedKey放置文件。我还没有想到他提到的第二个问题,即链接在使用前会过期

    下面是我在C#中使用共享访问签名生成url的步骤:

            string blobName = $"TestFile.txt";
            string storageAccountName = "aaaaaaaa";
            string containerName = "ccccccccc";
            string key = "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk==";
    
            string connectionString = $"DefaultEndpointsProtocol=https;AccountName={storageAccountName};AccountKey={key}";
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
            BlobClient blob = containerClient.GetBlobClient(blobName);
    
            var sasBuilder = new Azure.Storage.Sas.BlobSasBuilder()
            {
                BlobContainerName = containerName,
                BlobName = blobName,
                Resource = "b",  
                StartsOn = DateTime.UtcNow.AddMinutes(-5),
                ExpiresOn = DateTime.UtcNow.AddMinutes(120)
            };
            sasBuilder.SetPermissions(Azure.Storage.Sas.BlobSasPermissions.Create);
    
            StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, key);
            BlobSasQueryParameters sasQueryParameters = sasBuilder.ToSasQueryParameters(storageSharedKeyCredential);
    
            UriBuilder fullUri = new UriBuilder()
            {
                Scheme = "https",
                Host = string.Format($"{storageAccountName}.blob.core.windows.net"),
                Path = string.Format($"{containerName}/{blobName}"),
                Query = sasQueryParameters.ToString()
            };
    
            BlobClient blobClient = new BlobClient(fullUri.Uri, null);
    
            string uriToUseInPostman = fullUri.Uri.ToString();
    
    我用邮递员来测试这一点:


    注意,我必须设置x-ms-blob-type。如果没有此标题,上载将失败。

    谢谢@GauravMantri。我现在正在工作。以前我曾尝试使用SAS但没有成功,但现在意识到这是因为我没有在标题中设置x-ms-blob-type。我将很快为其他人上传我的代码。谢谢@GauravMantri。我现在正在工作。以前我曾尝试使用SAS但没有成功,但现在意识到这是因为我没有在标题中设置x-ms-blob-type。我将很快为其他人上传我的代码。