using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using System.IO.Compression; namespace WebApplication2.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class ValuesController : ControllerBase { public IWebHostEnvironment _environment; private readonly IContentTypeProvider _contentTypeProvider; public ValuesController(IWebHostEnvironment e) { this._environment = e; _contentTypeProvider = new FileExtensionContentTypeProvider(); } [HttpGet()] public async Task DownloadImage(string imageName) { try { // 安全检查:防止路径遍历攻击 if (imageName.Contains("..") || imageName.Contains("/") || imageName.Contains("\\")) { return BadRequest("无效的文件名"); } // 构建完整文件路径 var imagePath = Path.Combine(_environment.ContentRootPath, "images", imageName); // 检查文件是否存在 if (!System.IO.File.Exists(imagePath)) { return NotFound("图片不存在"); } // 获取文件内容类型 if (!_contentTypeProvider.TryGetContentType(imageName, out var contentType)) { contentType = "application/octet-stream"; } // 读取文件并返回 //var fileBytes = await System.IO.File.ReadAllBytesAsync(imagePath); var validFiles = new List<(string FileName, string FilePath)>(); validFiles.Add((imageName, imagePath)); var memoryStream = new MemoryStream(); // 创建zip归档 using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { foreach (var (fileName, filePath) in validFiles) { try { // 在zip中创建条目 var entry = archive.CreateEntry(fileName, CompressionLevel.Optimal); // 写入文件内容 using var entryStream = entry.Open(); using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); await fileStream.CopyToAsync(entryStream); } catch (Exception ex) { } } } memoryStream.Seek(0, SeekOrigin.Begin); // 返回zip文件 return File(memoryStream, "application/zip", "1.zip"); //// 重置流位置 //return File(fileBytes, contentType, imageName); } catch (Exception ex) { return StatusCode(500, $"下载失败: {ex.Message}"); } } } }