Xamarin Forms Android:如何正确读写文件并将图片存入MultipartFormDataContent
Xamarin Forms Android 拍照后文件管理与上传解决方案
1. 正确将文件名写入TXT文件
优先选择应用私有内部存储(无需额外权限,仅本应用可访问)来存储TXT文件,路径通过系统API获取即可。
实现代码
using System.IO; using System.Collections.Generic; public void StorageNameInList(List<string> listImgName) { // 获取应用私有存储根目录 string storageRoot = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); // 拼接TXT文件完整路径 string txtPath = Path.Combine(storageRoot, "image_records.txt"); try { // 覆盖写入所有文件名,每行一个 File.WriteAllLines(txtPath, listImgName); } catch (IOException ex) { // 捕获写入异常,可根据需求添加日志或提示 Console.WriteLine($"写入失败:{ex.Message}"); } }
如果需要将TXT存到外部公共存储(如DCIM),需在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Android 10及以上版本建议配合MediaStore使用,或申请MANAGE_EXTERNAL_STORAGE权限,但私有存储方案更省心。
2. 读取TXT文件名并添加到MultipartFormDataContent
读取TXT中的文件名后,拼接图片完整路径,打开文件流并添加到表单内容中。
实现代码
using System.IO; using System.Net.Http; using System.Collections.Generic; using System.Threading.Tasks; public async Task<bool> SendImages() { string storageRoot = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); string txtPath = Path.Combine(storageRoot, "image_records.txt"); // 替换为你实际存储图片的目录(和拍照时的保存路径一致) string imgStorageDir = Path.Combine(storageRoot, "CameraPhotos"); try { // 读取TXT中所有文件名 List<string> imgNames = File.ReadAllLines(txtPath).ToList(); if (imgNames.Count == 0) return false; using (var httpClient = new HttpClient()) using (var formContent = new MultipartFormDataContent()) { foreach (string imgName in imgNames) { string imgFullPath = Path.Combine(imgStorageDir, imgName); if (!File.Exists(imgFullPath)) continue; // 跳过不存在的文件 // 打开图片文件流 using (var fileStream = new FileStream(imgFullPath, FileMode.Open, FileAccess.Read)) { // 设置文件内容类型,添加到表单 var fileContent = new StreamContent(fileStream); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); // "upload_images"为后端接收的字段名,需和后端接口一致 formContent.Add(fileContent, "upload_images", imgName); } } // 发送POST请求到后端接口 var response = await httpClient.PostAsync("你的上传接口地址", formContent); return response.IsSuccessStatusCode; } } catch (IOException ex) { Console.WriteLine($"读取或上传失败:{ex.Message}"); return false; } }
配套拍照路径说明
使用CrossMedia拍照时,确保图片保存路径和上述代码中的imgStorageDir一致:
var photoFile = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { SaveToAlbum = false, Directory = "CameraPhotos", // 和上传代码中的子目录一致 Name = $"pic_{DateTime.Now:yyyyMMddHHmmss}.jpg" }); // 提取文件名存入listImgName string imgFileName = Path.GetFileName(photoFile.Path); listImgName.Add(imgFileName);
内容的提问来源于stack exchange,提问作者F205
相关产品推荐
相关产品推荐

