【发布时间】:2020-12-26 04:45:37
【问题描述】:
我正在使用 Azure Blob 存储,我想知道是否可以稍微优化一下这段代码。
如您所见,我正在创建文件夹,然后将内容上传到该文件夹,然后再发送到 Azure 存储,在竞争中我删除了该文件夹,公平地说似乎有点多余。
现在,我想知道是否可以跳过这几个步骤,直接将流上传到 azure 而不先复制到根文件夹?
代码如下:
public async Task UploadBlobFile(IFormFile file, BlobMetadata metadata, string containerName)
{
var containerClient = _blobServiceClient.GetBlobContainerClient(containerName);
BlobHttpHeaders headers = new BlobHttpHeaders
{
ContentType = "application/pdf",
ContentLanguage = "hr-HR",
};
if (file.Length > 0)
{
try
{
var rootFolder = Path.Combine(_hostingEnvironment.WebRootPath, "upload");
if (!Directory.Exists(rootFolder))
{
Directory.CreateDirectory(rootFolder);
}
// create folder if doesnt exists
var filePath = Path.Combine(rootFolder, file.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
// set cursor to the beginning of the stream.
stream.Position = 0;
var metadataProperties = new Dictionary<string, string>
{
{ MetadataValues.Id, metadata.Id },
{ MetadataValues.Name, metadata.Name },
{ MetadataValues.UniqueName, metadata.UniqueName }
};
var blobClient = containerClient.GetBlobClient(file.FileName);
await blobClient.UploadAsync(stream, headers, metadataProperties);
}
if (File.Exists(filePath))
{
File.Delete(filePath);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
【问题讨论】:
-
file的类型是什么?这将是回答你问题的关键。它似乎是基于流的,所以你试过blobClient.UploadAsync(file, headers, metadataProperties)吗? -
另请注意,正如所写,您的
try/catch没有任何作用,您应该删除它或在 catch 块中做一些有意义的事情。您也不应该使用throw ex;,因为它会破坏堆栈跟踪,而是使用throw;来重新引发异常。但是,如果你只是想重新抛出而不做任何其他事情(即记录),那么它与首先没有 try/catch 是“相同的” -
@pinkfloydx33 谢谢。我更新了代码示例
-
您可以在Storage中创建一个文件夹,然后直接上传您的文件。
-
IFormFile.OpenReadStream将返回一个Stream,您可以直接与blobClient.UploadAsync一起使用。
标签: c# asp.net-core azure-blob-storage