20
Апр
2021

Как обработать FormData в контроллере?

Делаю чат с возможностью посещать просматривать профили пользователей и, как следствие, редактировать свой профиль.

Использую croppie для обрезки аватара.

Код страницы:

<script src="~/js/croppie.min.js"></script>
<link rel="stylesheet" href="~/css/croppie.css">

<div>
    <div>
        <div id="main-cropper"></div>
        <a class="button actionSelect">
            <input type="file" id="select" value="Choose Image" accept="image/*">
        </a>
        <button class="actionUpload">Upload</button>
    </div>
</div>

<script>
    var basic = $('#main-cropper').croppie({
            viewport: { width: 400, height: 400 },
            boundary: { width:500, height: 500 },
            showZoomer: false
        });

        function readFile(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $('#main-cropper').croppie('bind', {
                        url: e.target.result
                    });
                }

                reader.readAsDataURL(input.files[0]);
            }
        }
        $('.actionSelect input').on('change', function () { readFile(this); });
    $('.actionUpload').on('click', function () {
        basic.croppie('result', 'blob').then(async function (blob) {
                var formData = new FormData();
                formData.append('blob',blob );
                var request = new XMLHttpRequest();
                request.open('POST','@Url.Action("SetAvatar","Account")');
                request.send(formData);
            });
        });
</script>

Код контроллера:

public async Task<IActionResult> SetAvatar(IFormFile formData)
        {
            User u = _userManager.FindByNameAsync(User.Identity.Name).Result;
            string filename = u.UserName + formData.FileName.Substring(formData.FileName.LastIndexOf('.'));
            if (formData != null)
            {
                string path = _appEnvironment.WebRootPath + "/Avatars/" + filename;
                if(System.IO.File.Exists(path))
                {
                    System.IO.File.Delete(path);
                }

                using (var fileStream = new FileStream(path, FileMode.Create))
                {
                    await formData.CopyToAsync(fileStream);
                }
                u.AvatarPath = filename;
                
                await db.SaveChangesAsync();
            }

            return RedirectToAction("Profile","Home");
        }

Файл не доходит до контроллера, formData = null.

Может быть есть какие-нибудь другие варианты загрузить изображение?

Источник: https://ru.stackoverflow.com/questions/1272489/%D0%9A%D0%B0%D0%BA-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-formdata-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%B5

Тебе может это понравится...

Добавить комментарий