using Hopetry.WebApi.Common; using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Hosting.Internal; using Newtonsoft.Json.Linq; using PictureFilesApi.Models; using PictureFilesApi.Models.RequestModel; using PictureFilesApi.Services; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; namespace PictureFilesApi.Controllers { /// /// 图片服务器控制器 /// [ApiController] [Route("api/[controller]/[action]")] public class PlatformController : ControllerBase { PlatformServices _app; private readonly IWebHostEnvironment _hostingEnvironment; /// /// 构造函数 /// /// public PlatformController(PlatformServices app, IWebHostEnvironment hostingEnvironment) { _app = app; _hostingEnvironment = hostingEnvironment; } /// /// 测试接口 /// /// [AllowAnonymous] [HttpGet] public Response Index() { Response response = new Response(); try { response.Result = "222"; } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 图片上传接口 /// /// /// /// [HttpPost] [AllowAnonymous] public Response> UploadOld(IFormFileCollection files, [FromQuery] AddOrUpdateUploadReq req) { req.init(); Response> response = new Response>(); try { response.Result = _app.Upload(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 图片上传接口 /// /// /// /// [HttpPost] [AllowAnonymous] public async Task>> Upload(IFormFileCollection files, [FromQuery] AddOrUpdateUploadReq req) { req.init(); Response> response = new Response>(); try { response.Result = await _app.UploadWithExif(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 图片删除 /// /// [HttpGet] [AllowAnonymous] public Response DeleteImg(string path) { Response response = new Response(); try { var fullPath = Path.Combine(_hostingEnvironment.ContentRootPath, path); response = _app.DeleteImg(fullPath); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 判断图片是否存在 /// /// 图片地址 /// [HttpGet] [AllowAnonymous] public Response ExistsImg(string path) { Response response = new Response(); try { var fullPath = Path.Combine(_hostingEnvironment.ContentRootPath, path); response = _app.ExistsImg(fullPath); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 复制图片 /// /// 图片地址 /// [HttpGet] [AllowAnonymous] public Response CopyImg(string path) { Response response = new Response(); try { var fullPath = Path.Combine(_hostingEnvironment.ContentRootPath, path); response = _app.CopyImg(fullPath); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } [HttpPost] [AllowAnonymous] public Response> UploadNoReName(IFormFileCollection files, [FromQuery] AddOrUpdateUploadReq req) { req.init(); Response> response = new Response>(); try { response.Result = _app.UploadNoReName(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 图片上传接口(微信) /// /// [HttpPost] [AllowAnonymous] public Response> UploadWeChat() { AddOrUpdateUploadReq req = new AddOrUpdateUploadReq(); req.init(); var files = HttpContext.Request.Form.Files; Response> response = new Response>(); try { response.Result = _app.Upload(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 图片上传接口(带水印) /// /// /// /// [HttpPost] [AllowAnonymous] public Response> UploadGraph(IFormFileCollection files, [FromQuery] AddOrUpdateUploadGraphReq req) { req.init(); Response> response = new Response>(); try { response.Result = _app.UploadGraph(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 东蒙上传图片(带水印) /// /// /// /// [HttpPost] [AllowAnonymous] public Response> UploadGraphDongMeng(IFormFileCollection files, [FromQuery] AddOrUpdateUploadDongmengReq uploadReq) { AddOrUpdateUploadGraphReq req = new AddOrUpdateUploadGraphReq(); req.project = "DongmengViolation"; req.color = "white"; req.haveFileName = 0; req.haveDateTime = 0; req.watermark = ""; req.watermark += "经纬度:" + uploadReq.lng_lat; req.watermark += "\n" + "地址:" + uploadReq.address; req.watermark += "\n" + "时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Response> response = new Response>(); try { response.Result = _app.UploadGraph(files, req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 下载图片 /// /// /// [HttpPost] [AllowAnonymous] public Response DownLoadPictures([FromBody] QueryDownLoadPicturesReq req) { Response response = new Response(); try { req.Init(); response.Result = _app.DownLoadPictures(req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 下载图片 /// /// /// [AllowAnonymous] [HttpGet] public IActionResult DownLoadPicture(string path) { try { //根目录 var root = AppDomain.CurrentDomain.BaseDirectory; //完整路径 var fullpath = root + path; //转为流 var readStream = System.IO.File.ReadAllBytes(fullpath); //文件名 string fileName = path.Substring(path.LastIndexOf("\\") + 1); //扩展名 string extName = fileName.Substring(fileName.IndexOf(".") + 1); //返回前台 return File(readStream, "application/octet-stream", fileName); } catch (Exception ex) { return null; } } /// /// 下载压缩文件 /// /// /// [AllowAnonymous] [HttpGet] public IActionResult DownLoadFile(string path) { try { //根目录 var root = AppDomain.CurrentDomain.BaseDirectory; //完整路径 var fullpath = root + path; //转为流 var readStream = System.IO.File.ReadAllBytes(fullpath); //文件名 string fileName = path.Substring(path.LastIndexOf("\\") + 1); //扩展名 string extName = fileName.Substring(fileName.IndexOf(".") + 1); //fileName = System.Web.HttpUtility.UrlEncode(fileName); //返回前台 return File(readStream, "application/octet-stream", fileName); } catch (Exception ex) { return null; } } /// /// 下载网络图片到本地路径 /// /// [AllowAnonymous] [HttpPost] public Response DownLoadInternetToLocal([FromBody] AddOrUpdateDownLoadInternetToLocalReq req) { Response response = new Response(); try { response.Result = _app.DownLoadInternetToLocal(req); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } /// /// 测试异步上传 /// /// /// [AllowAnonymous] [HttpPost] public async Task> UploadImages([FromForm] List Files) { return await _app.UploadImages(Files); } [AllowAnonymous] [HttpPost] public async Task> UploadImages1() { var form = await Request.ReadFormAsync(); return await _app.UploadImages1(form); } /// /// 上传图片并解析附带 Exif(时间、坐标) /// /// /// /// //[HttpPost] //[AllowAnonymous] //[RequestSizeLimit(1024 * 1024 * 2000)] //public Response> UploadWithExif(IFormFileCollection files, [FromQuery] AddOrUpdateUploadReq req) //{ // var list = new List(); // foreach (var file in files) // { // var exif = new FileExif(); // using (MemoryStream memoryStream = new MemoryStream()) // { // file.CopyTo(memoryStream); // memoryStream.Position = 0; // using (SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(memoryStream)) // { // var exifProfile = image.Metadata.ExifProfile; // if (exifProfile != null) // { // var latitudeValues = exifProfile.GetValue(ExifTag.GPSLatitude)?.Value; // if (latitudeValues != null) // { // double latitude = Common.ImageHelper.ConvertDMSToDecimal(latitudeValues); // exif.Lat = latitude; // exif.IsExif = true; // } // var lngitudeValues = exifProfile.GetValue(ExifTag.GPSLongitude)?.Value; // if (latitudeValues != null) // { // double longitude = Common.ImageHelper.ConvertDMSToDecimal(lngitudeValues); // exif.Lng = longitude; // } // var fileTime = exifProfile.GetValue(ExifTag.DateTimeOriginal)?.Value; // if (!string.IsNullOrEmpty(fileTime)) // { // DateTime dateTime = DateTime.ParseExact(fileTime, "yyyy:MM:dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); // exif.DateTime = dateTime; // } // } // } // } // try // { // var uploadResult = _app.Add(file, req); // exif.Path = uploadResult.FilePath; // exif.IsUpload = true; // list.Add(exif); // } // catch (Exception ex) // { // exif.Remark = $"{file.FileName} 上传失败! {ex.Message}"; // } // } // return new Response> // { // Result = list // }; //} [HttpPost] [AllowAnonymous] [RequestSizeLimit(1024 * 1024 * 2000)] public Response> UploadWithExif(IFormFileCollection files, [FromQuery] AddOrUpdateUploadReq req) { var list = new ConcurrentBag(); Parallel.ForEach(files, file => { var exif = new FileExif(); using (MemoryStream memoryStream = new MemoryStream()) { file.CopyTo(memoryStream); memoryStream.Position = 0; using (SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(memoryStream)) { var exifProfile = image.Metadata.ExifProfile; if (exifProfile != null) { var latitudeValues = exifProfile.GetValue(ExifTag.GPSLatitude)?.Value; if (latitudeValues != null) { double latitude = Common.ImageHelper.ConvertDMSToDecimal(latitudeValues); exif.Lat = latitude; exif.IsExif = true; } var longitudeValues = exifProfile.GetValue(ExifTag.GPSLongitude)?.Value; if (longitudeValues != null) { double longitude = Common.ImageHelper.ConvertDMSToDecimal(longitudeValues); exif.Lng = longitude; } var fileTime = exifProfile.GetValue(ExifTag.DateTimeOriginal)?.Value; if (!string.IsNullOrEmpty(fileTime)) { DateTime dateTime = DateTime.ParseExact(fileTime, "yyyy:MM:dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); exif.DateTime = dateTime; } } } } try { var uploadResult = _app.Add(file, req); exif.Path = uploadResult.FilePath; exif.IsUpload = true; lock (list) { list.Add(exif); } } catch (Exception ex) { exif.Remark = $"{file.FileName} 上传失败! {ex.Message}"; } }); return new Response> { Result = list }; } /// /// 复制图片 /// /// 图片地址 /// [HttpPost] [AllowAnonymous] public async Task>> NewCopyImg([FromForm] string path) { var response = new Response>(); try { //var fullPath = Path.Combine(_hostingEnvironment.ContentRootPath, path); response.Result = await _app.NewCopyImg(path); } catch (Exception ex) { response.Code = 500; response.Message = ex.InnerException != null ? ex.InnerException.Message : ex.Message; } return response; } } }