| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using System.Text; |
| | | using System.IO; |
| | | |
| | | namespace WIDESEA_WMSServer.Controllers.System |
| | | { |
| | |
| | | } |
| | | return content; |
| | | } |
| | | [HttpPost, HttpGet, Route("DownLoadLog"), AllowAnonymous] |
| | | public virtual ActionResult DownLoadLog(string fileName) |
| | | { |
| | | try |
| | | { |
| | | // 1. 参数验证 |
| | | if (string.IsNullOrWhiteSpace(fileName)) |
| | | { |
| | | return BadRequest("文件名不能为空"); |
| | | } |
| | | |
| | | string logDirectory = Path.Combine(AppContext.BaseDirectory, "Logs"); |
| | | |
| | | if (!Directory.Exists(logDirectory)) |
| | | { |
| | | Directory.CreateDirectory(logDirectory); |
| | | } |
| | | |
| | | string filePath = Path.Combine(logDirectory, fileName); |
| | | |
| | | if (Directory.Exists(filePath)) |
| | | { |
| | | return NotFound($"文件 {fileName} 不存在"); |
| | | } |
| | | |
| | | string extension = Path.GetExtension(fileName).ToLowerInvariant(); |
| | | if (!IsAllowedFileType(extension)) |
| | | { |
| | | return BadRequest($"不支持的文件类型: {extension}"); |
| | | } |
| | | |
| | | FileInfo fileInfo = new FileInfo(filePath); |
| | | |
| | | if (fileInfo.Length > 50 * 1024 * 1024) // 50MB限制 |
| | | { |
| | | return BadRequest("文件过大,无法下载"); |
| | | } |
| | | |
| | | byte[] fileBytes; |
| | | using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) |
| | | { |
| | | using (MemoryStream memoryStream = new MemoryStream()) |
| | | { |
| | | fileStream.CopyTo(memoryStream); |
| | | fileBytes = memoryStream.ToArray(); |
| | | } |
| | | } |
| | | |
| | | string contentType = GetContentType(extension); |
| | | |
| | | return File(fileBytes, contentType, fileName); |
| | | } |
| | | catch (UnauthorizedAccessException) |
| | | { |
| | | return StatusCode(403, "没有访问该文件的权限"); |
| | | } |
| | | catch (PathTooLongException) |
| | | { |
| | | return BadRequest("文件路径过长"); |
| | | } |
| | | catch (IOException ex) |
| | | { |
| | | return StatusCode(500, "文件读取失败,可能正在被其他进程使用"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return StatusCode(500, $"服务器内部错误: {ex.Message}"); |
| | | } |
| | | } |
| | | private bool IsAllowedFileType(string extension) |
| | | { |
| | | var allowedTypes = new[] { ".txt", ".log", ".csv", ".json", ".xml" }; |
| | | return allowedTypes.Contains(extension); |
| | | } |
| | | |
| | | private string GetContentType(string extension) |
| | | { |
| | | return extension.ToLowerInvariant() switch |
| | | { |
| | | ".txt" => "text/plain; charset=utf-8", |
| | | ".log" => "text/plain; charset=utf-8", |
| | | ".csv" => "text/csv; charset=utf-8", |
| | | ".json" => "application/json; charset=utf-8", |
| | | ".xml" => "application/xml; charset=utf-8", |
| | | _ => "application/octet-stream" |
| | | }; |
| | | } |
| | | } |
| | | } |