我正在使用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-data
与application/json
)。
相反,您应该使用Stream
作为参数。然后,在UploadDoc
动作中,您可以简单地执行以下操作:
using (var stream = file.OpenReadStream())
{
await documentRepository.UploadFile(stream);
}
而且,您只有一个字节数组:
using (var stream = new MemoryStream(byteArray))
{
await documentRepository.UploadFile(stream);
}
您可能还考虑添加
UploadFile
的byte[]
重载,因为从字节数组创建新的内存流只是为了拥有流而浪费资源。但是,byte[]
的处理方式必须不同于Stream
,因此它可能需要一些逻辑上的重复才能走这条路线。您需要评估权衡。关于c# - ByteArray到IFormFile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58378491/