为什么使用ImageSharp处理Blazor IBrowserFile时提示不支持同步读取
问题原因
- Blazor WebAssembly 环境下
IBrowserFile.OpenReadStream()返回的BrowserFileStream仅支持异步读取操作,你调用的Image.Load()是ImageSharp的同步加载API,内部会触发流的同步读取逻辑,直接抛出NotSupportedException,这就是你第37行代码报错的根本原因。 file.OpenReadStream()打开的流不需要手动关闭,只要将其放在using代码块中,作用域结束后会自动释放资源,你原来代码中手动调用MemoryStream的Close()、Dispose()也是多余操作,用using包裹即可自动处理。
修复方案
你需要先将BrowserFileStream的内容异步拷贝到支持同步操作的MemoryStream中,再交给ImageSharp处理,修复后的代码如下:
public async Task<byte[]> ConvertFileToByteArrayAsync(IBrowserFile file) { // 此处2*1024*1024表示允许最大2MB的文件,可根据需求调整,默认上限为512KB using var sourceStream = file.OpenReadStream(2 * 1024 * 1024); using var memoryStream = new MemoryStream(); // 异步拷贝文件流内容到MemoryStream await sourceStream.CopyToAsync(memoryStream); // 复位流指针到开头,供后续读取 memoryStream.Seek(0, SeekOrigin.Begin); using var image = Image.Load(memoryStream); image.Mutate(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Min, Size = new Size(128) })); using var outputStream = new MemoryStream(); if (file.ContentType == "image/png") { await image.SaveAsPngAsync(outputStream); } else { await image.SaveAsJpegAsync(outputStream); } return outputStream.ToArray(); }
注意事项
- 若需要处理更大体积的图片,直接调整
OpenReadStream方法的maxAllowedSize参数即可。 - 所有实现了
IDisposable接口的流对象都建议用using包裹,无需手动处理释放逻辑,避免资源泄漏。
内容的提问来源于stack exchange,提问作者sbrevolution5
相关产品推荐
相关产品推荐

