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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:15:35