如何使用C#将文件夹及其内容上传至REST Web服务(Content-Type为application/json)
没问题,我来给你捋清楚怎么实现这个需求——因为要求Content-Type是application/json,咱们没法用常规的multipart/form-data上传文件,得换个思路:把文件夹结构和文件内容转成JSON能识别的格式,也就是把文件内容编码成Base64字符串,再和文件夹结构一起打包成JSON发送。
实现思路
核心逻辑是:
- 递归遍历目标文件夹,把所有文件、子文件夹的结构信息整理成对象
- 将每个文件的二进制内容编码为Base64字符串(JSON无法直接存储二进制数据)
- 把整理好的对象序列化为JSON字符串
- 用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
相关产品推荐
相关产品推荐

