using Microsoft.AspNetCore.Mvc; namespace CodePlay.WebAPI.Controllers; [ApiController] [Route("api/[controller]")] public class FileController : ControllerBase { private readonly ILogger _logger; private readonly string _uploadPath; public FileController(ILogger logger, IWebHostEnvironment env) { _logger = logger; _uploadPath = Path.Combine(env.ContentRootPath, "uploads"); if (!Directory.Exists(_uploadPath)) Directory.CreateDirectory(_uploadPath); } [HttpPost("upload")] public async Task> UploadFile(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("请选择要上传的文件"); var ext = Path.GetExtension(file.FileName).ToLower(); if (!new[] { ".cs", ".java", ".cpp", ".hpp", ".cc", ".py", ".txt" }.Contains(ext)) return BadRequest($"不支持的文件类型:{ext}"); var fileName = $"{Guid.NewGuid():N}{ext}"; var filePath = Path.Combine(_uploadPath, fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } var content = await System.IO.File.ReadAllTextAsync(filePath); _logger.LogInformation("文件上传成功:{FileName} ({Size} bytes)", file.FileName, file.Length); return Ok(new FileUploadResult { FileName = file.FileName, StoredName = fileName, FilePath = filePath, FileSize = file.Length, Content = content, Language = DetectLanguage(ext) }); } [HttpPost("upload-content")] public ActionResult UploadContent([FromBody] UploadContentRequest request) { if (string.IsNullOrWhiteSpace(request.Content)) return BadRequest("内容不能为空"); var ext = GetExtensionFromLanguage(request.Language); var fileName = $"{Guid.NewGuid():N}{ext}"; var filePath = Path.Combine(_uploadPath, fileName); System.IO.File.WriteAllText(filePath, request.Content); return Ok(new FileUploadResult { FileName = request.FileName ?? $"code{ext}", StoredName = fileName, FilePath = filePath, FileSize = request.Content.Length, Content = request.Content, Language = request.Language }); } [HttpGet("{fileName}/content")] public async Task> GetFileContent(string fileName) { var filePath = Path.Combine(_uploadPath, fileName); if (!System.IO.File.Exists(filePath)) return NotFound(); var content = await System.IO.File.ReadAllTextAsync(filePath); return Ok(content); } private string DetectLanguage(string ext) => ext switch { ".cs" => "CSharp", ".java" => "Java", ".cpp" or ".hpp" or ".cc" => "CPlusPlus", ".py" => "Python", _ => "Unknown" }; private string GetExtensionFromLanguage(string language) => language.ToLower() switch { "csharp" => ".cs", "java" => ".java", "cplusplus" or "c++" => ".cpp", "python" => ".py", _ => ".txt" }; } public class FileUploadResult { public string FileName { get; set; } = ""; public string StoredName { get; set; } = ""; public string FilePath { get; set; } = ""; public long FileSize { get; set; } public string Content { get; set; } = ""; public string Language { get; set; } = ""; } public class UploadContentRequest { public string? FileName { get; set; } public string Content { get; set; } = ""; public string Language { get; set; } = "CSharp"; }