我正在用C#和Net Core开发一些REST API
我的存储库中有一个函数,它接受IFormFile
类型的参数。
public async Task<bool> UploadFile(IFormFile file)
{
// do some stuff and save the file to azure storage
}
此函数由一个控制器方法调用,该方法将上载的文件传递给它
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
。
有可能吗?
发布于 2019-10-14 14:59:08
您的存储库不应该使用IFormFile
。这是一种抽象,只适用于HTTP文件传输的一种特定方法(即multipart/form-data
编码的请求主体)。像你的repo这样的东西应该不知道文件的来源(超文本传输协议),也不知道它是如何传输的(例如multipart/form-data
vs application/json
)。
相反,您应该为您的参数使用Stream
。然后,在您的UploadDoc
操作中,您可以简单地执行以下操作:
using (var stream = file.OpenReadStream())
{
await documentRepository.UploadFile(stream);
}
而且,如果你只有一个字节数组:
using (var stream = new MemoryStream(byteArray))
{
await documentRepository.UploadFile(stream);
}
您还可以考虑添加一个采用byte[]
的UploadFile
重载,因为仅仅为了拥有一个流而从一个字节数组创建一个新的内存流是一种资源浪费。但是,byte[]
的处理方式必须与Stream
不同,因此它可能需要一些重复的逻辑才能走这条路。您将需要评估权衡。
发布于 2019-10-14 14:11:12
可以将字节数组转换为MemoryStream
var stream = new MemoryStream(byteArray);
然后,..and将其传递给FromFile
类的constructor:
IFormFile file = new FormFile(stream, 0, byteArray.Length, "name", "fileName");
发布于 2021-06-06 12:04:58
完整的代码:
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();
}
https://stackoverflow.com/questions/58378491
复制相似问题