# FileTransfer **Repository Path**: sky0535/FileTransfer ## Basic Information - **Project Name**: FileTransfer - **Description**: 实现文件的断点续传 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-07-07 - **Last Updated**: 2025-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 文件传输系统 这是一个支持断点续传的文件传输系统,包含服务端、客户端和公共类库三个部分。 ## 项目结构 ``` FileTransfer/ ├── FileServer/ # 服务端项目 (ASP.NET Core Web API) │ ├── Controllers/ # API控制器 │ │ └── FileController.cs # 文件操作控制器 │ ├── Models/ # 服务端模型 │ │ └── UploadMessage.cs # 上传消息模型 │ ├── Files/ # 文件存储目录 │ ├── wwwroot/ # 静态文件 │ │ ├── index.html # Web界面主页面 │ │ ├── styles/ # CSS样式文件 │ │ │ └── index.css # 主样式文件 │ │ └── scripts/ # JavaScript脚本文件 │ │ └── index.js # 主脚本文件 │ ├── Properties/ # 项目属性 │ ├── bin/ # 编译输出目录 │ ├── obj/ # 临时编译文件 │ ├── appsettings.json # 配置文件 │ ├── appsettings.Development.json # 开发环境配置 │ ├── FileServer.csproj # 项目文件 │ ├── FileServer.csproj.user # 用户项目文件 │ ├── FileServer.http # HTTP测试文件 │ ├── Program.cs # 程序入口 │ └── Logs/ # 日志文件目录 │ ├── *.log # 生产环境日志文件 │ └── debug-*.log # 开发环境日志文件 ├── FileClient/ # 客户端项目 (.NET Windows Forms) │ ├── Models/ # 客户端模型 │ │ ├── DownloadTask.cs # 下载任务模型 │ │ └── ProgressEventArgs.cs # 进度事件参数 │ ├── Utils/ # 工具类 │ │ └── FileDownloadService.cs # 文件下载服务 │ ├── bin/ # 编译输出目录 │ ├── obj/ # 临时编译文件 │ ├── MainForm.cs # 主窗体 │ ├── MainForm.Designer.cs # 窗体设计器 │ ├── MainForm.resx # 窗体资源 │ ├── App.ico # 应用图标 │ ├── FileClient.csproj # 项目文件 │ ├── FileClient.csproj.user # 用户项目文件 │ ├── Program.cs # 程序入口 │ └── NLog.config # NLog日志配置文件 ├── Common/ # 公共类库项目 │ ├── Models/ # 共享模型 │ │ └── FileData.cs # 文件数据模型 │ ├── Utils/ # 工具类 │ │ └── ConfigHelper.cs # 配置助手 │ ├── bin/ # 编译输出目录 │ ├── obj/ # 临时编译文件 │ └── Common.csproj # 项目文件 ├── .git/ # Git版本控制目录 ├── .vs/ # Visual Studio配置目录 ├── .gitignore # Git忽略文件 ├── FileTransfer.sln # 解决方案文件 ├── LICENSE # 许可证文件 └── README.md # 项目说明文档 ``` ## 功能特性 ### 服务端 (FileServer) - ✅ 文件列表获取 - 获取服务器Files目录下的所有文件信息 - ✅ 文件信息查询 - 查询指定文件的详细信息(大小、修改时间等) - ✅ 支持断点续传的文件下载 - 通过HTTP Range请求实现断点续传 - ✅ 文件上传功能 - 支持大文件上传(最大10GB) - ✅ 文件删除功能 - 支持删除服务器上的文件 - ✅ 静态文件服务 - 提供Web界面上传文件 - ✅ Web界面功能 - 支持拖拽上传、实时进度显示、文件列表管理 - ✅ 大文件支持 - 最大支持10GB文件传输 - ✅ 超时配置 - 可配置的请求超时时间 - ✅ 错误处理 - 完善的异常处理和日志记录 - ✅ 日志系统 - 支持文件日志和控制台日志输出 - ✅ CORS支持 - 跨域资源共享配置 - ✅ 请求限制配置 - 支持大文件上传的请求体大小限制 ### 客户端 (FileClient) - ✅ 图形化用户界面 - Windows Forms界面,操作简单直观 - ✅ 文件列表浏览 - 实时获取并显示服务器文件列表 - ✅ 多文件同时下载 - 支持并发下载多个文件 - ✅ 实时下载进度显示 - 显示当前下载进度百分比 - ✅ 下载速度显示 - 实时显示下载速度(平滑计算) - ✅ 剩余时间估算 - 基于当前速度估算剩余下载时间 - ✅ 断点续传支持 - 网络中断后可从断点继续下载 - ✅ 下载任务管理 - 管理多个下载任务的状态 - ✅ 暂停/继续下载 - 支持暂停和继续下载操作 - ✅ 取消下载功能 - 支持随时取消正在进行的下载 - ✅ 临时文件管理 - 自动清理下载过程中的临时文件 - ✅ 按钮状态管理 - 根据下载任务状态智能启用/禁用按钮 - ✅ 窗体关闭处理 - 关闭时自动取消所有下载任务并释放资源 ### 公共类库 (Common) - ✅ 共享数据模型 - FileData模型在服务端和客户端间共享 - ✅ 配置助手 - ConfigHelper提供统一的配置常量 - ✅ 跨项目类型定义 - 确保服务端和客户端使用相同的数据结构 - ✅ 缓冲区配置 - 统一的缓冲区大小和超时配置 - ✅ 网络配置 - 统一的网络连接和重试配置 ## 技术栈 - **服务端**: ASP.NET Core 8.0 Web API - **客户端**: .NET 8.0 Windows Forms - **公共类库**: .NET 8.0 Class Library - **Web界面**: HTML5 + CSS3 + JavaScript (ES6+) - **通信**: HTTP REST API - **断点续传**: HTTP Range 请求头 - **序列化**: System.Text.Json - **文件操作**: System.IO.FileStream - **异步编程**: async/await 模式 - **事件驱动**: C# 事件机制 - **项目架构**: 三层架构(服务端、客户端、公共类库) - **配置管理**: IConfiguration 依赖注入 - **日志记录**: Serilog + ILogger 接口 - **前端技术**: XMLHttpRequest (进度监控), Fetch API, CSS3 动画 - **UI框架**: Windows Forms (.NET 8.0) - **依赖注入**: Microsoft.Extensions.DependencyInjection ## 快速开始 ### 1. 启动服务端 ```bash cd FileServer dotnet run ``` 服务端将在 `http://localhost:5000` 启动。 ### 2. 启动客户端 ```bash cd FileClient dotnet run ``` ### 3. 使用Web界面 访问 `http://localhost:5000` 可以使用Web界面上传文件。 **Web界面特性:** - 🎯 **拖拽上传** - 支持将文件直接拖拽到上传区域 - 📊 **实时进度** - 显示上传进度条和百分比 - 📁 **文件管理** - 实时显示服务器文件列表 - 🎨 **现代界面** - 美观的响应式设计 - ⚡ **快速下载** - 一键下载服务器文件 - 🗑️ **文件删除** - 支持删除服务器文件(带确认对话框) ### 4. 项目依赖关系 - **FileServer** 依赖 **Common** 项目 - **FileClient** 依赖 **Common** 项目 - **Common** 是独立的类库项目,不依赖其他项目 ## API接口 ### 获取文件列表 ``` GET /api/file/list ``` ### 获取文件信息 ``` GET /api/file/info/{fileName} ``` ### 下载文件(支持断点续传) ``` GET /api/file/download/{fileName} Headers: Range: bytes=start-end ``` ### 上传文件 ``` POST /api/file/upload Content-Type: multipart/form-data ``` ### 删除文件 ``` DELETE /api/file/delete/{fileName} ``` ## 断点续传机制 ### 服务端实现 (FileController.cs) 1. **解析Range请求头**: 解析 `Range: bytes=start-end` 格式的请求头 2. **验证请求范围**: 检查start和end值是否在文件大小范围内 3. **设置响应头**: - `Accept-Ranges: bytes` - 表明支持Range请求 - `Content-Range: bytes start-end/total` - 指定返回的内容范围 - `Content-Length: length` - 返回内容的大小 4. **状态码处理**: - 206 Partial Content - 部分内容响应 - 200 OK - 完整文件响应 5. **文件流定位**: 使用 `FileStream.Seek()` 定位到指定位置 6. **流式传输**: 从指定位置开始传输文件内容 ### 客户端实现 (FileDownloadService.cs) 1. **断点信息管理**: - 使用 `.resume` 文件保存断点位置 - 使用 `.tmp` 文件保存下载中的文件 2. **断点检测**: 启动时检查是否存在未完成的下载 3. **Range请求**: 使用 `TryAddWithoutValidation` 安全设置 `Range` 请求头 4. **响应头验证**: 安全获取和验证 `Content-Range` 响应头 5. **文件流定位**: 使用 `FileStream.Seek()` 定位到断点位置 6. **进度监控**: 实时计算下载速度和剩余时间 7. **平滑速度计算**: 使用加权平均算法平滑速度显示 8. **异常处理**: 网络中断时保存断点信息,支持自动重试 9. **清理机制**: 下载完成后删除临时文件 10. **连接稳定性**: 优化的HttpClient配置,提高连接稳定性 ## 配置说明 ### 服务端配置 (appsettings.json) ```json { "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/{Date:yyyy-MM-dd}.log", "rollingInterval": "Day", "fileSizeLimitBytes": 10485760, "retainedFileCountLimit": 30, "rollOnFileSizeLimit": true, "shared": true, "flushToDiskInterval": "00:00:01" } } ] }, "AllowedHosts": "*", "FileDirectory": "Files" // 文件存储目录 } ``` ### 开发环境配置 (appsettings.Development.json) ```json { "Serilog": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "System": "Information" } }, "WriteTo": [ { "Name": "Console", "Args": { "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" } }, { "Name": "File", "Args": { "path": "Logs/debug-{Date:yyyy-MM-dd}.log", "rollingInterval": "Day", "fileSizeLimitBytes": 10485760, "retainedFileCountLimit": 30, "rollOnFileSizeLimit": true, "shared": true, "flushToDiskInterval": "00:00:01" } } ] } } ``` ### 公共配置 (ConfigHelper.cs) ```csharp public static class ConfigHelper { public const long MaxFileSize = 10_737_418_240; // 10GB public static TimeSpan MaxTimeout = TimeSpan.FromHours(2); // 2小时 public static int BufferSize = 512 * 1024; // 512KB public static long MaxRequestBufferSize = 8 * 1024 * 1024; // 8MB public static long MaxResponseBufferSize = 8 * 1024 * 1024; // 8MB public static int MaxRetries = 3; // 最大重试次数 public static TimeSpan RetryDelay = TimeSpan.FromSeconds(5); // 重试延迟 public static TimeSpan KeepAliveTimeout = TimeSpan.FromMinutes(5); // 连接保持时间 public static int MaxConnections = 100; // 最大连接数 } ``` ### 客户端配置 - 下载目录:`[程序所在目录]\Downloads` - 服务器地址:默认 `http://localhost:5000` - 按钮状态管理:根据下载任务列表自动启用/禁用暂停和取消按钮 ## 使用说明 ### 服务端 1. 运行服务端程序 2. 将文件放入 `Files` 目录 3. 或使用Web界面上传文件 4. 查看日志文件:`FileServer/Logs/*.log` (生产环境) 或 `FileServer/Logs/debug-*.log` (开发环境) ### 客户端 1. 运行客户端程序 2. 输入服务器地址并连接 3. 选择要下载的文件 4. 查看下载进度 5. 支持暂停/继续下载和取消下载 6. 按钮状态会根据下载任务自动调整 ### Web界面 1. **访问界面**: 在浏览器中访问 `http://localhost:5000` 2. **上传文件**: - 拖拽文件到上传区域 - 或点击"选择文件"按钮选择文件 3. **查看进度**: 上传过程中会显示实时进度条和百分比 4. **管理文件**: 页面下方显示服务器所有文件列表 5. **下载文件**: 点击文件列表中的"下载"按钮下载文件 6. **删除文件**: 点击文件列表中的"删除"按钮删除文件(需要确认) ## 特性优势 1. **断点续传**: 网络中断后可从断点继续下载 2. **多任务下载**: 支持同时下载多个文件 3. **实时进度**: 显示下载进度、速度和剩余时间 4. **用户友好**: 图形化界面,操作简单 5. **稳定可靠**: 完善的错误处理和异常恢复 6. **跨平台**: 服务端支持多平台,客户端支持Windows 7. **模块化设计**: 公共类库提供共享模型,便于维护和扩展 8. **代码复用**: 服务端和客户端共享相同的数据结构定义 9. **Web界面**: 现代化的Web界面上传体验 10. **拖拽上传**: 直观的文件拖拽上传功能 11. **实时反馈**: 上传进度条和状态提示 12. **响应式设计**: 适配不同屏幕尺寸的界面 13. **智能UI**: 按钮状态根据任务状态自动调整 14. **资源管理**: 窗体关闭时自动清理资源 ## 注意事项 1. **磁盘空间**: 确保服务端有足够的磁盘空间存储文件(最大支持10GB单个文件) 2. **网络连接**: 大文件下载时建议使用有线网络连接,避免WiFi不稳定导致频繁断点续传 3. **权限要求**: - 服务端Files目录需要有读写权限 - 客户端下载目录需要有写入权限 4. **配置调整**: - 最大文件大小可在 `Common/Utils/ConfigHelper.cs` 中调整 `MaxFileSize` - 缓冲区大小可在 `ConfigHelper.cs` 中调整 `BufferSize` - 超时时间可在 `ConfigHelper.cs` 中调整 `MaxTimeout` - 重试次数可在 `ConfigHelper.cs` 中调整 `MaxRetries` 5. **临时文件**: 下载过程中会在下载目录生成 `.tmp` 和 `.resume` 文件,请勿手动删除 6. **并发限制**: 客户端支持多文件同时下载,但建议控制并发数量避免服务器压力过大 7. **断点续传**: 系统支持自动重试和断点续传,网络中断后会自动从断点继续下载 8. **错误处理**: 完善的错误处理机制,包括连接超时、文件不完整等情况的自动恢复 9. **Web界面**: - 支持现代浏览器(Chrome、Firefox、Safari、Edge) - 文件上传支持拖拽和点击选择两种方式 - 上传进度实时显示,支持大文件上传 - 文件列表自动刷新,显示最新上传的文件 10. **前端文件**: CSS和JavaScript文件已分离到独立目录,便于维护和扩展 11. **日志管理**: 支持按日期滚动的日志文件,自动清理旧日志 12. **日志监控**: 可通过日志文件监控系统运行状态和排查问题 13. **日志配置**: 日志设置完全通过配置文件管理,支持不同环境的差异化配置 14. **窗体事件**: 客户端窗体关闭时会自动取消所有下载任务并释放资源 ## 开发环境 - Visual Studio 2022 或 VS Code - .NET 8.0 SDK - Windows 10/11 (客户端) - 现代浏览器 (Web界面开发) ## 日志系统 ### 服务端日志配置 项目使用 Serilog 作为日志框架,支持同时输出到控制台和文件。所有日志配置都从 `appsettings.json` 和 `appsettings.Development.json` 文件中读取,支持环境特定的配置。 **配置说明**: - 使用统一的 Serilog 配置,避免与传统 Logging 配置冲突 - 支持环境变量覆盖配置 - 配置文件支持热重载(修改后重启生效) - 日志文件命名策略: - 生产环境:使用纯日期格式 `{yyyy-MM-dd}.log`,简洁明了 - 开发环境:使用 `debug-{yyyy-MM-dd}.log` 格式,便于区分 ### 客户端日志配置 客户端使用 NLog 作为日志系统,日志配置文件为 `FileClient/NLog.config`,支持异步写入、日志文件按天分割、自动归档和控制台输出。 **NLog 配置说明**: - 日志文件路径:`FileClient/Logs/{yyyy-MM-dd}.log` - 归档目录:`FileClient/Logs/archives/` - 滚动策略:每天创建新文件,最多保留30天归档 - 同时输出到控制台和文件,便于开发调试 - 配置文件可自定义日志格式和归档策略 **日志目录结构示例**: ``` FileClient/Logs/ ├── 2024-01-15.log # 日志文件 ├── 2024-01-16.log └── archives/ ├── 1.log ├── 2.log └── ... ``` **NLog.config 示例片段**: ```xml ``` ### 日志文件 - **生产环境**: `FileServer/Logs/{yyyy-MM-dd}.log` (例如: 2024-01-15.log) - **开发环境**: `FileServer/Logs/debug-{yyyy-MM-dd}.log` (例如: debug-2024-01-15.log) - **滚动策略**: 按日期滚动,每天创建新文件 - **文件大小限制**: 10MB - **保留策略**: 保留最近30天的日志文件 - **日志级别**: - 生产环境: Information (默认), Warning (Microsoft/System) - 开发环境: Debug (默认), Information (Microsoft/System) ### 日志内容 - 服务器启动和关闭信息 - 文件上传/下载操作记录 - 错误和异常信息 - 性能监控数据 - API请求响应日志 ### 日志示例 ``` [2024-01-15 10:30:15 INF] 启动文件传输服务器... [2024-01-15 10:30:16 INF] 文件传输服务器启动完成,监听地址: http://localhost:5000 [2024-01-15 10:35:22 INF] 开始处理文件上传请求 [2024-01-15 10:35:22 INF] 文件信息: 名称=test.zip, 大小=1048576 字节 [2024-01-15 10:35:25 INF] 文件上传成功: test.zip, 大小: 1048576 字节, 路径: Files\test.zip ``` **日志文件命名示例**: - 生产环境: `2024-01-15.log` - 开发环境: `debug-2024-01-15.log` **日志目录结构示例**: ``` Logs/ ├── 2024-01-15.log # 生产环境日志 ├── 2024-01-16.log ├── debug-2024-01-15.log # 开发环境日志 └── debug-2024-01-16.log ``` ## Web界面技术实现 ### 文件结构 ``` FileServer/wwwroot/ ├── index.html # 主页面 ├── styles/ │ └── index.css # 样式文件 └── scripts/ └── index.js # 脚本文件 ``` ### 技术特点 - **模块化设计**: CSS和JavaScript分离到独立文件,便于维护 - **进度监控**: 使用XMLHttpRequest实现上传进度实时显示 - **拖拽上传**: 支持HTML5拖拽API,提供直观的上传体验 - **响应式布局**: CSS3媒体查询,适配不同屏幕尺寸 - **动画效果**: CSS3动画和过渡效果,提升用户体验 - **错误处理**: 完善的JavaScript错误处理和用户反馈 ### 主要功能 - ✅ 文件拖拽上传 - ✅ 实时进度显示 - ✅ 文件列表管理 - ✅ 一键下载功能 - ✅ 文件删除功能 - ✅ 状态消息提示 - ✅ 文件大小格式化显示 ## 客户端UI特性 ### 界面布局 - **服务器设置面板**: 服务器地址输入和连接/刷新按钮 - **文件列表面板**: 显示服务器文件列表,支持多选下载 - **下载进度面板**: 显示下载任务进度、速度、剩余时间和状态 ### 智能按钮管理 - **暂停/继续按钮**: 根据下载任务状态自动切换文本和功能 - **取消按钮**: 支持取消选中的下载任务 - **按钮状态**: 根据下载任务列表自动启用/禁用按钮 ### 事件处理 - **窗体关闭事件**: 自动取消所有下载任务并释放资源 - **下载进度事件**: 实时更新下载进度和速度显示 - **下载完成事件**: 自动清理任务并更新UI状态 ## 依赖包 ### 服务端依赖 (FileServer.csproj) ```xml ``` ### 客户端依赖 (FileClient.csproj) ```xml ``` ### 公共类库依赖 (Common.csproj) - 无外部依赖包,仅使用.NET 8.0内置功能 ## 许可证 MIT License