如何解决LiteDB db.FileStorage.Upload 流方法从不上传任何内容
private async Task SaveFile(IFormFile file,string someFileName)
{
using var stream = new MemoryStream();
await file.copyToAsync(stream);
db.FileStorage.Upload(SOMEPATHID,someFileName,stream);
// here just so i can verify the collection has no file data.
var entireCollection = db.FileStorage.Find(p => true);
}
流是在控制器上收到的有效 IFormFile
,我可以验证流是有效的并且有内容。
这不会引发任何错误并正常执行,但它以存储的文件结束,但没有存储块。 除文件数据外,所有信息均可用。
解决方法
猛击我的头一段时间后,我意识到由于流读取器的初始位置,流实际上无法读取。
在尝试上传之前添加 stream.Position = 0;
可以解决问题。
private async Task SaveFile(IFormFile file,string someFileName)
{
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Position = 0; //reset stream pointer.
db.FileStorage.Upload(SOMEPATHID,someFileName,stream);
//collection now has data !
var entireCollection = db.FileStorage.Find(p => true);
}
或者甚至更简单,永远不要将整个文件保存在内存中,您只需直接在 file.OpenReadStream()
上使用 db.fileStorage.Upload
,如下所示:
private async Task SaveFile(IFormFile file,string someFileName)
{
db.FileStorage.Upload(SOMEPATHID,file.OpenReadStream());
//collection still has data !
var entireCollection = db.FileStorage.Find(p => true);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。