Xamarin如何获取BindableLayout绑定的已选图片列表并实现上传
Xamarin 图片上传获取文件名和流的解决方案
你当前的核心问题是仅存储了用于界面展示的ImageSource对象,该类型本身不包含原始文件名、文件流读取相关的元数据,因此无法直接从ImageSource中提取上传需要的参数,按以下步骤调整即可:
步骤1:自定义图片信息存储模型
新建专门用于存储图片上传全量信息的类:
public class UploadImageItem { // 界面展示用的图片源 public ImageSource DisplaySource { get; set; } // 上传需要的文件名 public string FileName { get; set; } // 上传需要的文件流 public Stream ImageStream { get; set; } }
步骤2:修改全局列表类型和选图逻辑
将原来的全局图片列表替换为自定义类型,选图时直接保存所有需要的信息:
// 全局变量修改为自定义类型列表 List<UploadImageItem> imgList = new List<UploadImageItem>(); async void pickimg_Tapped(System.Object sender, EventArgs e) { var pickResult = await MediaGallery.PickAsync(5, MediaFileType.Image); if(pickResult?.Files == null) { return; } foreach (var img in pickResult.Files) { var stream = await img.OpenReadAsync(); imgList.Add(new UploadImageItem { DisplaySource = ImageSource.FromStream(() => stream), FileName = img.FileName, ImageStream = stream }); } BindableLayout.SetItemsSource(listImg, imgList); }
步骤3:修改XAML绑定逻辑
调整列表模板的绑定字段,对应自定义模型的展示属性:
<Image HeightRequest="70" WidthRequest="70" Aspect="AspectFill" Source="{Binding DisplaySource}"/>
步骤4:调整提交逻辑构造上传参数
遍历自定义列表即可直接拿到上传需要的所有参数:
private async void bt_addfeed_Clicked(object sender, EventArgs e) { if(imgList == null || imgList.Count == 0) { // 可补充无图片提示逻辑 return; } var content = new MultipartFormDataContent(); // 遍历所有选中的图片加入上传内容 foreach (var imgItem in imgList) { // 上传前重置流位置到开头,避免读取内容为空 imgItem.ImageStream.Seek(0, SeekOrigin.Begin); // 第三个参数为文件名,第二个参数files需要和后端接口约定的参数名保持一致 content.Add(new StreamContent(imgItem.ImageStream), "files", imgItem.FileName); } var httpClient = new HttpClient(); // 替换为实际的上传接口地址 var response = await httpClient.PostAsync("你的上传接口URL", content); // 上传完成后释放所有流资源 foreach (var imgItem in imgList) { imgItem.ImageStream.Dispose(); } // 可选:上传完成后清空选中列表重置状态 imgList.Clear(); BindableLayout.SetItemsSource(listImg, null); }
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

