using System; using System.IO; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; public class ImageController : ApiController { private readonly string _baseStoragePath = HttpContext.Current.Server.MapPath("~/StaticStorage"); private readonly string[] _allowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }; // 上传图片接口 [HttpPost] [Route("api/image/upload")] public HttpResponseMessage UploadImage() { try { if (!Request.Content.IsMimeMultipartContent()) { return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "请求必须包含多部分内容"); } var provider = new MultipartFormDataStreamProvider(Path.GetTempPath()); var result = Request.Content.ReadAsMultipartAsync(provider).Result; if (result.FileData.Count == 0) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "未接收到文件"); } var fileData = result.FileData[0]; var fileName = fileData.Headers.ContentDisposition.FileName.Trim('"'); var fileExt = Path.GetExtension(fileName).ToLower(); if (Array.IndexOf(_allowedExtensions, fileExt) == -1) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "不支持的文件类型"); } // 生成日期路径 var now = DateTime.Now; var year = now.ToString("yyyy"); var month = now.ToString("MM"); var day = now.ToString("dd"); // 生成唯一文件名 var newFileName = $"{now:yyyy-MM-dd-HHmmssfff}{fileExt}"; // 目标路径 var targetPath = Path.Combine(_baseStoragePath, "image", year, month, day); // 确保目录存在 Directory.CreateDirectory(targetPath); // 完整文件路径 var fullPath = Path.Combine(targetPath, newFileName); // 移动文件到目标位置 File.Move(fileData.LocalFileName, fullPath); // 返回访问URL var url = $"{Request.RequestUri.Scheme}://{Request.RequestUri.Authority}/static/image/{year}/{month}/{day}/{newFileName}"; return Request.CreateResponse(HttpStatusCode.OK, new { Url = url }); } catch (Exception ex) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); } } // 获取图片接口 - 实际由静态文件处理,这里只是示例 [HttpGet] [Route("static/image/{year}/{month}/{day}/{filename}")] public HttpResponseMessage GetImage(string year, string month, string day, string filename) { try { var filePath = Path.Combine(_baseStoragePath, "image", year, month, day, filename); if (!File.Exists(filePath)) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "文件不存在"); } var response = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); response.Content = new StreamContent(stream); // 根据文件扩展名设置ContentType var ext = Path.GetExtension(filename).ToLower(); switch (ext) { case ".jpg": case ".jpeg": response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"); break; case ".png": response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png"); break; case ".gif": response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/gif"); break; case ".bmp": response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/bmp"); break; default: response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); break; } return response; } catch (Exception ex) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); } } }