首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByteArray到IFormFile

ByteArray到IFormFile
EN

Stack Overflow用户
提问于 2019-10-14 22:05:15
回答 3查看 12.9K关注 0票数 6

我正在用C#和Net Core开发一些REST API

我的存储库中有一个函数,它接受IFormFile类型的参数。

代码语言:javascript
复制
public async Task<bool> UploadFile(IFormFile file)
{
    // do some stuff and save the file to azure storage
}

此函数由一个控制器方法调用,该方法将上载的文件传递给它

代码语言:javascript
复制
public class FileController : Controller
{
    public async Task<IActionResult> UploadDoc(IFormFile file
    {
        // Call the repository function to save the file on azure
        var res = await documentRepository.UploadFile(file);
    }
}

现在,我有了另一个调用外部API的函数,该API以字节数组的形式返回文件。我想使用repository.UploadFile方法保存这个字节数组,但是我不能将字节数组对象强制转换为IFormFile

有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-14 22:59:08

您的存储库不应该使用IFormFile。这是一种抽象,只适用于HTTP文件传输的一种特定方法(即multipart/form-data编码的请求主体)。像你的repo这样的东西应该不知道文件的来源(超文本传输协议),也不知道它是如何传输的(例如multipart/form-data vs application/json )。

相反,您应该为您的参数使用Stream。然后,在您的UploadDoc操作中,您可以简单地执行以下操作:

代码语言:javascript
复制
using (var stream = file.OpenReadStream())
{
    await documentRepository.UploadFile(stream);
}

而且,如果你只有一个字节数组:

代码语言:javascript
复制
using (var stream = new MemoryStream(byteArray))
{
    await documentRepository.UploadFile(stream);
}

您还可以考虑添加一个采用byte[]UploadFile重载,因为仅仅为了拥有一个流而从一个字节数组创建一个新的内存流是一种资源浪费。但是,byte[]的处理方式必须与Stream不同,因此它可能需要一些重复的逻辑才能走这条路。您将需要评估权衡。

票数 6
EN

Stack Overflow用户

发布于 2019-10-14 22:11:12

可以将字节数组转换为MemoryStream

代码语言:javascript
复制
var stream = new MemoryStream(byteArray);

然后,..and将其传递给FromFile类的constructor

代码语言:javascript
复制
IFormFile file = new FormFile(stream, 0, byteArray.Length, "name", "fileName");
票数 23
EN

Stack Overflow用户

发布于 2021-06-06 20:04:58

  1. 基于字节数组创建新的MemoryStream。
  2. 基于MemoryStream.
  3. Make创建新的FormFile对象。请务必附加ContentDisposition标头,否则您将无法操作FormFile对象,因为将引发C#异常。

完整的代码:

代码语言:javascript
复制
        using (var stream = new MemoryStream(byteArray))
        {
            var file = new FormFile(stream, 0, byteArray.Length, name, fileName)
            {
                Headers = new HeaderDictionary(),
                ContentType = contentType,
            };

            System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
            {
                FileName = file.FileName
            };
            file.ContentDisposition = cd.ToString();
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58378491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档