You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:25:20