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());
            }
        }
Пример #2
0
        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}")));
        }