【问题标题】:Uploading file without copying content to root folder .NET Core 2.2上传文件而不将内容复制到根文件夹.NET Core 2.2
【发布时间】: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


【解决方案1】:

正如 Bradley Uffnerpinkfloydx33 的同事所指出的,上面的代码可以这样优化

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)
    {
        using (var stream = file.OpenReadStream())
        {
            // 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);

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2020-10-05
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多