将文件放入无ContentLength的Azure Blob
我在一家公司工作,希望他们能够将一个文件放入我的Azure Blobstorage。我的想法是生成授权标头,并使用RESTAPI将此标头和其他必需的标头传递给他们。然后,他们使用它将文件放入我的Azure容器中 问题是我不知道他们要放的文件的大小。在我所有的研究和Postman测试中,我必须知道文件的大小,以便在创建授权头时设置ContentLength。只有这样,PUT才会成功。我的授权标头采用以下格式:将文件放入无ContentLength的Azure Blob,azure,api,blob,put,Azure,Api,Blob,Put,我在一家公司工作,希望他们能够将一个文件放入我的Azure Blobstorage。我的想法是生成授权标头,并使用RESTAPI将此标头和其他必需的标头传递给他们。然后,他们使用它将文件放入我的Azure容器中 问题是我不知道他们要放的文件的大小。在我所有的研究和Postman测试中,我必须知道文件的大小,以便在创建授权头时设置ContentLength。只有这样,PUT才会成功。我的授权标头采用以下格式: SharedKey storagename:zzzzzzzzzzzzzzzzzzzzzz
SharedKey storagename:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
我相信你所想的方法是行不通的 首先,在计算授权头时,您需要指定内容长度,而您显然不知道授权头的长度 其次,在计算授权标头时,必须指定当前日期时间(在
date
或x-ms-date
标头中)。您将遇到的问题是,如果不立即使用授权标头,您的客户机的请求将被拒绝
更好的选择是使用with
Write
权限。在这里,您不必担心包含内容长度。用户只需使用共享访问签名URL将文件上载到blob容器中。您可能希望为blob容器创建一个SAS URL,您希望用户在其中上载文件。我相信您认为的方法行不通
首先,在计算授权头时,您需要指定内容长度,而您显然不知道授权头的长度
其次,在计算授权标头时,必须指定当前日期时间(在date
或x-ms-date
标头中)。您将遇到的问题是,如果不立即使用授权标头,您的客户机的请求将被拒绝
更好的选择是使用withWrite
权限。在这里,您不必担心包含内容长度。用户只需使用共享访问签名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。我将很快为其他人上传我的代码。