【发布时间】:2021-11-06 02:16:14
【问题描述】:
最近我看到 Microsoft.Azure.Storage 已被弃用并开始迁移到新的 Azure.Blob.Storage SDK。除了 UploadAsync 方法在每次上传时都会引发异常之外,一切都运行良好。
我收到 409 The specified blob already exists 错误。但我 100% 确定 blob 不存在,因为它总是使用 GUID 上传并在上传方法之前添加断点并获取 BlobClient url 总是从 blobstorage 返回该 blob 不存在的 XML。
错误被抛出,但我的文件总是被上传。我不需要 overwrite: true 标志,因为它总是新的。
下面是一些示例代码:
public async Task StoreAsync(
string container,
string blob,
byte[] givenBytes,
CancellationToken cancellationToken = default)
{
BlobContainerClient containerReference = this.client.GetBlobContainerClient(container);
await containerReference.CreateIfNotExistsAsync();
BlobClient blobReference = containerReference.GetBlobClient(blob);
cancellationToken.ThrowIfCancellationRequested();
await blobReference.UploadAsync(new BinaryData(givenBytes), CancellationToken.None);
}
请注意,字符串 blob 参数始终是来自其他地方的 GUID。
这是完整的课程:
public class CustomBlobStore : IBlobStore
{
private BlobServiceClient client;
public CustomBlobStore(string accountName, string accountKey)
{
this.client = new BlobServiceClient(CreateBlobStoreConnectionString(accountName, accountKey));
}
private static string CreateBlobStoreConnectionString(string accountName, string accountKey)
{
return "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
}
public async Task StoreAsync(
string container,
string blob,
byte[] givenBytes,
CancellationToken cancellationToken = default)
{
BlobContainerClient containerReference = this.client.GetBlobContainerClient(container);
await containerReference.CreateIfNotExistsAsync();
BlobClient blobReference = containerReference.GetBlobClient(blob);
cancellationToken.ThrowIfCancellationRequested();
await blobReference.UploadAsync(new BinaryData(givenBytes), CancellationToken.None);
}
}
这是调用函数的方式(附件可以是任何类型的文件):
public async Task<ActionResult> SaveFile(IEnumerable<HttpPostedFileBase> files)
{
var file = files.First();
byte[] fileData;
using (var ms = new MemoryStream())
{
file.InputStream.CopyTo(ms);
fileData = ms.ToArray();
}
StoreAttachmentAsync(Guid.NewGuid(),fileData);
}
private Task StoreAttachmentAsync(string name, byte[] attachment)
{
return this.customBlobStore.StoreAsync('/attachments', name, attachment);
}
【问题讨论】:
-
首先段落在stackoverflow上是免费的,其次让我们比较一下原始sdk和新sdk,你能不能给两者都显示minimal reproducible example供参考
-
@TheGeneral 抱歉,这是我第一次在这里提问。希望这会有所帮助。
-
您是在存储模拟器还是实际的云存储中上传文件?您上传的文件有多大。
-
@GauravMantri 我们正在直接上传到云存储。这发生在任何文件大小上。即使是 1kb 的文件。
-
请编辑您的问题并包含您如何调用
StoreAttachmentAsync方法的代码。
标签: c# .net azure blob blobstore