如何使用 ASP.NET 和基于 .NET 的控制器将 260kb 的 PDF 文件上传到 Azure Blob 存储?

How do you upload 260kb PDF file to Azure Blob Storage using ASP.NET and .NET based Controller?

我目前正在尝试使用 Swagger UI 上传大小为 260kb 的 pdf 文件,但它不起作用。如果我尝试用一​​个 50kb 的小 Word 文件做同样的事情,它就可以了。

我的控制器代码是:

    [HttpPost()]
    public async Task<IActionResult> Upload(IFormFile file)
    {
        var name = SanitizeFilename(file.FileName);

        if (String.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException();
        }

        using (Stream stream = file.OpenReadStream())
        {
            await storage.Save(stream, name);
        }
        
        return Accepted();
    }

我的 AzureBlobStorage class 的保存方法是:

        public async Task<Task> Save(Stream fileStream, string name)
    {
        var blobContainer = await GetBlobContainerAsync();
        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);

        var task = blockBlob.UploadFromStreamAsync(fileStream);

        var success = task.IsCompletedSuccessfully;

        return task;
        //return blockBlob.UploadFromStreamAsync(fileStream);
    }

这是一些调试 windows:

  1. 此为word文档控制器:

  1. 这是来自PDF文档的控制者:

注意 red/pink 不同的字母。

  1. 这是来自AzureBlobStorage的保存方法-word文档:

  1. 这是来自AzureBlobStorage的保存方法-pdf文档:

我已阅读 IFormFile 可能无法进行连续流式传输,但我如何知道这是否是问题所在?如果是,首选方法是什么?

我没有遵循你的逻辑:

public async Task<Task> Save(Stream fileStream, string name)
{
    var blobContainer = await GetBlobContainerAsync();
    CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);

    var task = blockBlob.UploadFromStreamAsync(fileStream);

    var success = task.IsCompletedSuccessfully;

    return task;
    //return blockBlob.UploadFromStreamAsync(fileStream);
}

应该这样写:

public async Task Save(Stream fileStream, string name)
{
    var blobContainer = await GetBlobContainerAsync();
    CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
    await blockBlob.UploadFromStreamAsync(fileStream);
}

您想在这里等待任务在您 return 之前完成。

返回 Task<Task> 有点不合常理,对于您想在此处执行的操作没有意义。

另外,请记住,如果您的文件非常大,Kestrel 服务器可能会放弃请求。完成请求有大约 90 秒范围内的超时。因此,如果上传文件的时间超过 90 秒,调用方可能会收到错误消息(但上传仍会完成)。

通常您会将文件转储到磁盘,然后 return 一个 Accepted 给调用者。然后post将文件上传到后台队列中上传文件。关于 here 的更多信息。