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;
}
}
}