Xamarin Android WebView多文件上传问题:现有代码仅支持单文件上传
Xamarin Android WebView 多文件上传解决方案
问题分析
你的现有代码仅通过data.Data获取单个文件Uri,无法处理多文件选择场景。Android中多文件选择的结果会通过ClipData返回,需要针对性调整逻辑。
解决方案
1. 修改OnActivityResult方法
替换原有的FILECHOOSER_RESULTCODE处理逻辑,添加ClipData的判断与遍历:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) { if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; List<Android.Net.Uri> uriList = new List<Android.Net.Uri>(); if (data != null && resultCode == Result.Ok) { // 处理多文件选择(ClipData) if (data.ClipData != null) { int count = data.ClipData.ItemCount; for (int i = 0; i < count; i++) { Android.Net.Uri uri = data.ClipData.GetItemAt(i).Uri; uriList.Add(uri); } } // 兼容单个文件选择场景 else if (data.Data != null) { uriList.Add(data.Data); } } try { Android.Content.Context context = Application.Context; string text = uriList.Count.ToString(); ToastLength duration = ToastLength.Long; var toast = Toast.MakeText(context, text, duration); toast.Show(); mUploadMessage.OnReceiveValue(uriList.ToArray()); } catch (Exception e) { // 可添加异常日志记录逻辑 } mUploadMessage = null; } // 相机上传逻辑保持不变 if (requestCode == CameraCHOOSER_RESULTCODE) { if (null == this.mUploadMessage || (resultCode != Result.Ok && !new File(filePath).Exists())) { this.mUploadMessage.OnReceiveValue(null); } else { Android.Net.Uri mCapturedImageURI = Android.Net.Uri.FromFile(new File(filePath.ToString())); Android.Net.Uri[] results = new Android.Net.Uri[] { mCapturedImageURI }; mUploadMessage.OnReceiveValue(results); } this.mUploadMessage = null; } base.OnActivityResult(requestCode, resultCode, data); }
2. 配置WebChromeClient支持多选
在你设置WebChromeClient的OnShowFileChooser方法中,给Intent添加允许多选的参数:
public override bool OnShowFileChooser(WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams) { mUploadMessage = filePathCallback; Intent intent = new Intent(Intent.ActionGetContent); intent.SetType("*/*"); // 开启系统文件选择器的多选功能 intent.PutExtra(Intent.ExtraAllowMultiple, true); intent.AddCategory(Intent.CategoryOpenable); Intent chooserIntent = Intent.CreateChooser(intent, "选择文件"); StartActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); return true; }
关键说明
Intent.ExtraAllowMultiple:该参数开启系统文件选择器的多选能力,是实现多文件上传的核心配置。ClipData:用户选择多个文件时,系统会通过data.ClipData返回所有选中文件的Uri集合,需遍历获取每个Uri。- 兼容性:方案适配Android 5.0(API Level 21)及以上版本,覆盖当前主流设备。
内容的提问来源于stack exchange,提问作者Arvind Tyagi
相关产品推荐
相关产品推荐

