【问题标题】:Convert FormFile to Stream将 FormFile 转换为流
【发布时间】:2021-07-04 03:09:32
【问题描述】:

我正在做一个 ASP .NET Core MVC Web 应用程序。 Web 应用程序中有一个模块可以将文件上传到 Blob 存储。

以下是我用来将文件上传到 blob 存储的函数:

public CloudBlockBlob UploadBlob(string BlobName, string ContainerName, IFormFile file)
{
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(ContainerName.ToLower());
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(BlobName);

    try
    {
        blockBlob.UploadFromStreamAsync((Stream) file); //trying to convert FormFile to Stream type object and upload to blob storage
        return blockBlob;
    }
    catch (Exception e)
    {
        var r = e.Message;
        return null; 
    }
}

在那里,我已经将 FormFile 对象 'file' 转换为 try 块中给出的 Stream 对象。
但不是将文件上传到 blob 存储,而是给出 Exception:

Unable to cast object of type 'Microsoft.AspNetCore.Http.FormFile' to type 'System.io.stream'

问题:
是否可以将 IFormFile 对象转换为 Stream 或者是否有其他适当的方法可以做到这一点?

谢谢。

PS: 要获取输入文件,我必须使用 FormFile 类型的对象,但要将文件上传到 blob 存储,我必须使用 Stream 类型的对象。所以,为了解决这个问题,我必须将输入的 FormFile 转换为 Stream 类型的对象。

【问题讨论】:

    标签: c# asp.net-core-mvc azure-blob-storage


    【解决方案1】:

    您可以创建一个 MemoryStream 并将表单文件的内容复制到其中,然后上传内存流的内容。

    using(var ms = new MemoryStream()) {
        await file.CopyToAsync(ms);
        ms.Seek(0, SeekOrigin.Begin);
        blockBlob.UploadFromStreamAsync(ms);
    }
    

    【讨论】:

    • 先生。卡尔,谢谢你的回答。你能解释一下这个cancellationToken是什么吗?我没明白。
    • 哦,抱歉,这是从我当前的一些代码中复制的。 CancellationTokens 用于取消异步调用链。如果您的项目中不使用它们,则可以将其删除。
    • 是的,您的代码运行良好。我非常感谢您的明确回答。
    【解决方案2】:
    【解决方案3】:

    将 FormFile 转换为流:

    var stream = [YourFormFile].OpenReadStream();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2010-10-19
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多