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

如何使用C#将文件夹及其内容上传至REST Web服务(Content-Type为application/json)

没问题,我来给你捋清楚怎么实现这个需求——因为要求Content-Type是application/json,咱们没法用常规的multipart/form-data上传文件,得换个思路:把文件夹结构和文件内容转成JSON能识别的格式,也就是把文件内容编码成Base64字符串,再和文件夹结构一起打包成JSON发送。

实现思路

核心逻辑是:

  1. 递归遍历目标文件夹,把所有文件、子文件夹的结构信息整理成对象
  2. 将每个文件的二进制内容编码为Base64字符串(JSON无法直接存储二进制数据)
  3. 把整理好的对象序列化为JSON字符串
  4. 用HttpClient发送POST请求,指定Content-Type: application/json
具体代码实现

1. 定义数据模型

首先创建两个类,用来描述文件夹和文件的结构,方便后续序列化为JSON:

public class FileItem
{
    // 文件名(含扩展名)
    public string FileName { get; set; }
    // 文件内容的Base64编码字符串
    public string Base64Content { get; set; }
}

public class FolderItem
{
    // 文件夹名称
    public string FolderName { get; set; }
    // 子文件夹列表
    public List<FolderItem> SubFolders { get; set; } = new List<FolderItem>();
    // 当前文件夹下的文件列表
    public List<FileItem> Files { get; set; } = new List<FileItem>();
}

2. 递归遍历文件夹

写一个递归方法,把本地文件夹的结构和文件内容转换成上面定义的对象:

private static FolderItem TraverseFolder(string folderPath)
{
    var folderInfo = new DirectoryInfo(folderPath);
    var folderItem = new FolderItem { FolderName = folderInfo.Name };

    // 遍历并处理子文件夹
    foreach (var subDir in folderInfo.GetDirectories())
    {
        folderItem.SubFolders.Add(TraverseFolder(subDir.FullName));
    }

    // 遍历并处理当前文件夹下的文件
    foreach (var file in folderInfo.GetFiles())
    {
        try
        {
            // 读取文件二进制内容,转成Base64
            var fileContent = File.ReadAllBytes(file.FullName);
            var base64Content = Convert.ToBase64String(fileContent);
            
            folderItem.Files.Add(new FileItem
            {
                FileName = file.Name,
                Base64Content = base64Content
            });
        }
        catch (IOException ex)
        {
            Console.WriteLine($"读取文件{file.Name}失败:{ex.Message}");
        }
    }

    return folderItem;
}

3. 发送JSON请求到REST服务

最后用HttpClient把整理好的JSON数据发送到API:

private static async Task UploadFolderToApi(string folderPath, string apiUrl)
{
    try
    {
        // 生成文件夹结构的对象模型
        var folderData = TraverseFolder(folderPath);

        // 序列化为JSON字符串
        var jsonOptions = new JsonSerializerOptions { WriteIndented = true };
        var jsonContent = JsonSerializer.Serialize(folderData, jsonOptions);

        // 创建请求内容,指定Content-Type为application/json
        var requestContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

        // 发送POST请求
        using var httpClient = new HttpClient();
        var response = await httpClient.PostAsync(apiUrl, requestContent);

        // 确保请求成功(非200-299状态码会抛出异常)
        response.EnsureSuccessStatusCode();
        Console.WriteLine("文件夹及内容上传成功!");
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine($"API请求失败:{ex.Message}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"上传过程出错:{ex.Message}");
    }
}

4. 调用示例

// 替换成你要上传的文件夹路径和API地址
var targetFolder = @"C:\Your\Local\Folder\Path";
var apiEndpoint = "https://your-rest-api.com/upload-folder";

// 调用上传方法(注意:如果是控制台程序,Main方法要加async)
await UploadFolderToApi(targetFolder, apiEndpoint);
注意事项
  • Base64体积问题:Base64编码会让文件体积增加约30%,如果文件夹里有超大文件,要确认API的请求大小限制,必要时可以和后端沟通分块上传的方案。
  • API端解析:需要确保REST服务能正确解析这个JSON结构,将Base64字符串还原为二进制文件,并重建对应的文件夹结构。
  • 异常处理:代码里的异常处理可以根据你的实际需求细化,比如处理文件权限不足、网络中断等场景。

内容的提问来源于stack exchange,提问作者tennisno1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:20:49