首页 > 解决方案 > 仅上传最后一个文件 (Azure Blob)

问题描述

我将文件集合以并行方式上传到 blob(C# 中的 IFormFiles)。

我使用信号量和 TPL 来并行上传。(来源

但除最后一个文件外,所有文件都仅以 64 Kb 上传。最新文件已完全上传。

我不知道为什么忽略 4Mb 的块大小并使用 64Kb 以及为什么只上传 1 个块默认大小。

这是一个代码:

public static async Task UploadBulkAsync(string storageConnectionString, string containerName, Dictionary<string, IFormFile> blobNameToFile)
    {
        var completed = 0;
        var semaphore = new SemaphoreSlim(AppGlobalSettings.BulkUploadAzureBlobThreadCount, AppGlobalSettings.BulkUploadAzureBlobThreadCount);
        var tasks = new List<Task>();

        var options = new BlobRequestOptions
        {
            ParallelOperationThreadCount = 20
        };

        var blobContainer = await GetContainerAsync(storageConnectionString, containerName);
        await blobContainer.SetPermissionsAsync(new BlobContainerPermissions() { PublicAccess = BlobContainerPublicAccessType.Blob });

        foreach (var one in blobNameToFile)
        {
            var name = one.Key;
            var file = one.Value;

            var blockBlob = blobContainer.GetBlockBlobReference(name);
            blockBlob.Properties.ContentType = file.ContentType;

            await semaphore.WaitAsync();

            tasks.Add(blockBlob.UploadFromStreamAsync(file.OpenReadStream(), null, options, null).ContinueWith(t =>
            {
                semaphore.Release();
                Interlocked.Increment(ref completed);
            }));
        }

        await Task.WhenAll(tasks);
    }

标签: azureazure-blob-storage

解决方案


问题出在 IFormFile 对象的集合中。您不能在同一请求处理中打开多个 IFormFile 流。它们需要按顺序处理。

链接:在 AWS Lambda 中获取“内部流位置已意外更改”


推荐阅读