Xamarin.Forms使用Xamarin.Essentials上传文件异常问题
问题解决:Xamarin.Essentials 文件选择后上传报 FileNotFoundException
问题根源
你用FileSystem.OpenAppPackageFileAsync(file.FileName)是错误的——这个方法仅用于读取应用安装包内置的资源文件(比如Assets目录下的文件),完全不适用于用户从设备存储选择的外部文件。再加上Android 12+的存储权限机制变更,直接通过FullPath访问外部文件也会因权限不足失败,这就是触发异常的核心原因。
修正后的上传代码
直接使用FileResult自带的OpenReadAsync()方法获取文件流,这是Xamarin.Essentials推荐的安全方式,无需处理复杂的权限和路径问题:
var content = new MultipartFormDataContent(); // 直接通过FileResult获取文件流,用using自动释放资源 using (var stream = await file.OpenReadAsync()) { // 修正表单参数格式,添加文件内容到Multipart表单 content.Add(new StreamContent(stream), "fileUpload", $"\"{file.FileName}\""); } var httpClient = new HttpClient(); var response = await httpClient.PostAsync(new Uri("REST API Path"), content);
额外注意事项
- 不要手动依赖
FullPath:Android 12+引入了存储访问框架(SAF),FilePicker返回的FullPath可能只是SAF的标识而非真实文件路径,直接用它访问文件会因权限不足失败。 - 始终用
using包裹流:确保流在使用后自动释放,避免资源泄漏。 - 简化表单参数:原代码中
"\"fileUpload\""这类转义可以简化为"fileUpload",文件名的引号用$"\"{file.FileName}\""即可,避免转义混乱。
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

