.NET MAUI:相机拍摄图片转byte[]失败,无法存入MongoDB求助
解决.NET MAUI拍照后图片转byte[]时文件被占用的问题
问题核心
拍照生成的图片文件被相机进程锁定,直接读取会触发“文件被其他进程占用”错误,线程休眠无法解决是因为无法预判进程释放资源的时机。
可行解决方案
1. 跳过本地文件,直接从流转换byte[]
修改拍照逻辑,不先保存到本地文件,直接通过流获取图片数据并转换:
async Task CaptureAndConvertImage() { var capturedPhoto = await MediaPicker.CapturePhotoAsync(); if (capturedPhoto == null) return; using var imageStream = await capturedPhoto.OpenReadAsync(); using var memoryStream = new MemoryStream(); await imageStream.CopyToAsync(memoryStream); byte[] imageBytes = memoryStream.ToArray(); // 后续将imageBytes存入MongoDB即可 }
2. 必须存本地文件时,确保流完全释放
如果业务需要先保存文件,用using语句确保所有流都被正确释放后再读取:
async Task CaptureSaveAndConvertImage() { var capturedPhoto = await MediaPicker.CapturePhotoAsync(); if (capturedPhoto == null) return; string tempFilePath = Path.Combine(FileSystem.CacheDirectory, "temp_capture.jpg"); // 用using包裹流,确保操作完成后自动释放资源 using var sourceStream = await capturedPhoto.OpenReadAsync(); using var fileStream = File.OpenWrite(tempFilePath); await sourceStream.CopyToAsync(fileStream); // 此时文件已完全释放,可正常读取 byte[] imageBytes = File.ReadAllBytes(tempFilePath); // 存入MongoDB // 可选:删除临时文件 File.Delete(tempFilePath); }
3. 避开FullPath直接读取的坑
不要直接通过capturedPhoto.FullPath读取文件,该路径对应的文件大概率还被相机进程锁定,优先用OpenReadAsync()获取流操作。
内容的提问来源于stack exchange,提问作者Arup
相关产品推荐
相关产品推荐

