public async Task <IActionResult> Patch([FromForm] UserPatchAvatarInputModel model) { var user = await UserManager.FindByEmailAsync(User.Identity.Name); using (var stream = new MemoryStream()) { await model.File.CopyToAsync(stream); using (var imageStream = new MemoryStream()) { // 将文件剪裁为180 * 180 px const int px = 180; stream.Seek(0, SeekOrigin.Begin); using (var image = Image.Load(stream)) { if (image.Width < image.Height) { var times = (decimal)image.Height / image.Width; image.Mutate(x => x.Resize(px, (int)(px * times))); } else { var times = (decimal)image.Width / image.Height; image.Mutate(x => x.Resize((int)(px * times), px)); } image.Mutate(x => x.Crop(new Rectangle(0, 0, px, px))); switch (model.File.ContentType.ToLower()) { case "image/jpeg": case "image/jpg": image.Save(imageStream, new JpegEncoder()); break; case "image/png": image.Save(imageStream, new PngEncoder()); break; default: throw new ArgumentOutOfRangeException(); } } var id = await FileManager.CreateFileAsync(imageStream, model.File.ContentType, model.File.FileName); var location = $"/api/images/{id}"; user.Avatar = location; await UserManager.UpdateAsync(user); } return(NoContent()); } }
public async Task <IActionResult> Patch([FromRoute] string id, [FromForm] UserPatchAvatarInputModel model) { var user = await _userManager.FindByEmailAsync(User.Identity.Name); var image = await model.File.ResizeFile(180); var fileId = await _fileManager.CreateFileAsync(image, model.File.ContentType, model.File.FileName); await image.DisposeAsync(); user.AvatarId = fileId; await _userManager.UpdateAsync(user); return(Ok(new ApiResult <string>($"/api/files/{user.AvatarId}"))); }