| | |
| | | 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" }; |
| | | namespace HH.WCS.Mobox3.AnGang.api { |
| | | public class ImageController : ApiController { |
| | | private readonly string _baseStoragePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "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, "请求必须包含多部分内容"); |
| | | // 上传图片接口 |
| | | [HttpPost] |
| | | [Route("UploadImage")] |
| | | 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 }); |
| | | } |
| | | |
| | | var provider = new MultipartFormDataStreamProvider(Path.GetTempPath()); |
| | | var result = Request.Content.ReadAsMultipartAsync(provider).Result; |
| | | |
| | | if (result.FileData.Count == 0) { |
| | | return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "未接收到文件"); |
| | | catch (Exception ex) { |
| | | return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 获取图片接口 - 实际由静态文件处理,这里只是示例 |
| | | [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); |
| | | } |
| | | } |
| | | } |
| | | } |