关键点说明:
1 要引用:System.Drawing.Common
2 获取文件 IFormFile file = Request.Form.Files.FirstOrDefault();
3 获取表单数据 Request.Form["minfotype"].FirstOrDefault();
4 根据业务需求计算 新图片大小。一些是等比。我这里是设置了最大的宽度,如果大于就缩小。不然不处理。
if (objImage.Width > imgMaxWidth)//原始图片比目标位宽
5 IFormFile转Image
using (var memoryStream = new MemoryStream())
{
await file.CopyToAsync(memoryStream);
objImage = System.Drawing.Image.FromStream(memoryStream);
}
6 新图片保存
Bitmap outBmp = new Bitmap(desWidth, desHeight);
Graphics g = Graphics.FromImage(outBmp);
g.Clear(Color.Transparent);
// 设置画布的描绘质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(objImage, new Rectangle(0, 0, desWidth, desHeight + 1), 0, 0, objImage.Width, objImage.Height, GraphicsUnit.Pixel);
outBmp.Save(savePath, objImage.RawFormat);
g.Dispose();
outBmp.Dispose();
/// <summary>
/// 更新
/// </summary>
/// <returns></returns>
[HttpPost]
//[DisableRequestSizeLimit]
[RequestSizeLimit(800_000_000)]//限制800M左右
public async Task<ActionResult> UploadFile()
{
var uwer = base.GetUserLoginInfo();
var _folder = $@"/Upload";//env 可通过Controller的参数传入,并取得:IHostingEnvironment _env
var minfotype = Request.Form["minfotype"].FirstOrDefault();//特殊业务类型 changeimgsize 等比缩放
var minfodata = Request.Form["minfodata"].FirstOrDefault();//特殊业务相关数据
IFormFile file = Request.Form.Files.FirstOrDefault();
List<FileInfo> fileInfos = new List<FileInfo>();
if (file.Length > 0)
{
string fileId = Guid.NewGuid().ToString();
var dirPath = _folder + $"/Template/{fileId}";
if (!Directory.Exists(_env.WebRootPath + dirPath))
{
Directory.CreateDirectory(_env.WebRootPath + dirPath);
}
var filePath = $@"{dirPath}/{file.FileName}";
var hasSave =false;
if (minfotype == "changeimgsize")
{
hasSave = await GetImageSizeAsync(file, int.Parse(minfodata), _env.WebRootPath + filePath);
}
if (!hasSave)
{
using (var stream = new FileStream(_env.WebRootPath + filePath, FileMode.Create))
{
await file.CopyToAsync(stream);//写入到服务器。
}
}
var fileinfo = new FileInfo();
fileinfo.FileId = fileId;
fileinfo.FilePath = filePath;
fileInfos.Add(fileinfo);
}
return Ok(fileInfos);
}
/// <summary>
/// 检测并保存图片
/// </summary>
/// <param name="file"></param>
/// <param name="imgMaxWidth"></param>
/// <returns></returns>
public static async Task<bool> GetImageSizeAsync(IFormFile file, int imgMaxWidth, string savePath)
{
try
{
if (!file.ContentType.StartsWith("image")) return false;
System.Drawing.Image objImage;
using (var memoryStream = new MemoryStream())
{
await file.CopyToAsync(memoryStream);
objImage = System.Drawing.Image.FromStream(memoryStream);
}
int desWidth = 0; int desHeight = 0;//目标宽高
if (objImage.Width > imgMaxWidth)//原始图片比目标位宽
{
decimal radioAct = (decimal)objImage.Width / (decimal)objImage.Height;//原始图片的宽高比
desWidth = imgMaxWidth;
desHeight = (int)((decimal)imgMaxWidth / radioAct);
}
else
{ return false; }
Bitmap outBmp = new Bitmap(desWidth, desHeight);
Graphics g = Graphics.FromImage(outBmp);
g.Clear(Color.Transparent);
// 设置画布的描绘质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(objImage, new Rectangle(0, 0, desWidth, desHeight + 1), 0, 0, objImage.Width, objImage.Height, GraphicsUnit.Pixel);
outBmp.Save(savePath, objImage.RawFormat);
g.Dispose();
outBmp.Dispose();
objImage.Dispose();
return true;
}
catch (Exception e)
{ return false; }
}