虽然来晚了一些,但带来了一些想法。有时,您可能无法直接在“c:/”路径下写入文件,这需要获取提升权限(例如以管理员身份运行应用)。如果将路径更改为用户文件夹,则不会遇到此问题。
另一个问题是,对于非常大的文件,可能无法通过一次调用ReadAsync方法完成读取,这时需要使用循环逐块读取。
最后,如果不打算将文件内容转换至内存中处理,我不建议使用字节缓冲区。可以直接将内容写入文件,避免浪费内存。
另外,我分享一下解决这个问题的代码片段:
<InputFile id="@ImageId" OnChange="OnImageSelected" accept="image/jpg" />
@code {
private async Task OnImageSelected(InputFileChangeEventArgs fileArgs)
{
IBrowserFile selectedImage = fileArgs.File;
string imageName = selectedImage.Name;
using Stream inputStream = fileArgs.File.OpenReadStream(fileArgs.File.Size);
// 使用提供的文件名创建新文件,并指定与输入流相同的长度
using FileStream outputStream = File.Create($@"C:\{imageName}.jpg", (int)inputStream.Length, FileOptions.None);
// 异步将输入流的内容复制到新创建的文件中
await inputStream.CopyToAsync(outputStream);
}
}
对于同时处理多个文件的情况,实现上与此相差不大。