使用URI中的API_key查询字符串将公共映像复制到Azure存储

w8f9ii69  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(75)

我正在使用C# Azure Storage客户端获取图像,然后复制到Azure Storage blob容器,格式如下:

https://some-image-server.com/2023/03/13.png?api_key=my-api-key

我使用StartCopyFromUriAsync是这样的:

await blobClient.StartCopyFromUriAsync(new Uri(imageUrl));

我的代码可以很好地处理没有api_key查询字符串的常规公共图像。但是使用上面的图像格式,客户端将0 KB复制到Azure存储中,其中Copy StatusFailed(响应标头状态为通用500错误)。这是不可行的,因为图像不是真正的公共图像?我必须使用流或其他替代方案解决吗?

jvidinwx

jvidinwx1#

您从StartCopyFromUriAsync方法获得的问题不支持复制需要身份验证的映像。
该图像需要访问api_key查询字符串,该字符串不是公共的。
要将映像复制到Azure存储,您需要使用HTTP client下载映像,该HTTP client可以使用api_key查询字符串对请求进行身份验证。
下载映像后,需要使用BlobClientUploadAsync方法将其上载到Azure存储
有关详细信息,请查看Github Issue #32684

HttpClient http_Client = new HttpClient();
http_Client.DefaultRequestHeaders.Add("api_key", apiKey);

HttpResponseMessage resp = await http_Client.GetAsync(imageUrl);
resp.EnsureSuccessStatusCode();
Stream contentStream = await resp.Content.ReadAsStreamAsync();
BlobServiceClient blobService_Client = new BlobServiceClient(conn_String);
BlobContainerClient container_Client = blobServiceClient.GetBlobContainerClient(container);
BlobClient blob_Client = containerClient.GetBlobClient(blob);

await blobClient.UploadAsync(contentStream, true);

将一个存储复制到另一个存储的示例。
使用方法StartCopyFromUriAsync将URI中包含api_key查询字符串的公共映像复制到Azure存储

BlobServiceClient srcBlobServiceClient = new BlobServiceClient(srcConnectionString);
BlobServiceClient destBlobServiceClient = new BlobServiceClient(destConnectionString);

BlobContainerClient srcContainerClient = srcBlobServiceClient.GetBlobContainerClient(srcContainerName);
BlobContainerClient destContainerClient = destBlobServiceClient.GetBlobContainerClient(destContainerName);

BlobClient srcBlobClient = srcContainerClient.GetBlobClient(srcBlobName);
BlobClient destBlobClient = destContainerClient.GetBlobClient(destBlobName);

await destBlobClient.StartCopyFromUriAsync(srcBlobClient.Uri);

在Azure中

有关详细信息,请检查此Blog.

相关问题