我正在使用C#和Net Core开发一些REST API
我的存储库中有一个函数可以接受IFormFile类型的参数。

public async Task<bool> UploadFile(IFormFile file)
{
    // do some stuff and save the file to azure storage
}

该函数由 Controller 方法调用,该 Controller 方法将上传的文件传递给该函数
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
可能吗?

最佳答案

您的仓库不应该使用IFormFile。这是一种抽象,仅适用于HTTP文件传输的一种特定方法(即multipart/form-data编码的请求正文)。像您的仓库这样的东西应该不知道文件(HTTP)的来源,也不知道其传输方式(例如multipart/form-dataapplication/json)。

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

using (var stream = file.OpenReadStream())
{
    await documentRepository.UploadFile(stream);
}

而且,您只有一个字节数组:
using (var stream = new MemoryStream(byteArray))
{
    await documentRepository.UploadFile(stream);
}

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

关于c# - ByteArray到IFormFile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58378491/

10-16 11:43