Копирование IFormFile в поток памяти ObjectDisposedException - PullRequest
0 голосов
/ 09 января 2020

В настоящее время я использую tinyMCE для создания новостного поста для веб-сайта. Мне нужно иметь возможность загружать изображения, однако я нажал на остановку.

Когда я нажимаю на свой контроллер, я получаю

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'FileBufferingReadStream'.
   at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ThrowIfDisposed()
   at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.set_Position(Int64 value)
   at Microsoft.AspNetCore.Http.Internal.ReferenceReadStream..ctor(Stream inner, Int64 offset, Int64 length)
   at Microsoft.AspNetCore.Http.Internal.FormFile.OpenReadStream()
   at Microsoft.AspNetCore.Http.Internal.FormFile.CopyToAsync(Stream target, CancellationToken cancellationToken)
   at HardwareOnlineDk.Web.Areas.Admin.Controllers.ImageController.Upload(IFormFile inputFile) in D:\Kode\HardwareOnlineRider\HOL\SourceCode\Main\Web\Areas\Admin\Controllers\ImageController.cs:line 139

Мой код выглядит так:

[HttpPost, ActionName("Upload")]
        public async Task<IActionResult> Upload(IFormFile inputFile)
        {
            try
            {
                var filesCount = Request.Form.Files.Count;

                if (filesCount == 0)
                    return BadRequest("Ingen fil fundet");

                // Get HTTP posted file based on the fieldname. 
                var file = Request.Form.Files.GetFile("file");

                if (file == null)
                    return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");

                // Check if the file is valid.
                if (!Check(file.FileName, file.ContentType))
                    return BadRequest("Fil ikke gyldig");

                var memoryStream = new MemoryStream();
                await file.CopyToAsync(memoryStream);
                var medie = new Medie
                {
                    Name = file.FileName.Trim('\"'),
                    ParentId = _imageService.TempFolderGuid,
                    ContentLength = file.Length,
                    Content = memoryStream.ToArray()
                };

                try
                {
                    var imageId = await _imageService.Medier_InsertMedie(medie);

                    //TODO Her skal vi gemme ImageId i Session


                    return Json(new
                    {
                        location = $"/api/media/{imageId.Id}.jpg"
                    });
                }
                catch
                {
                    return BadRequest("Kunne ikke gemme billede");
                }
            }
            catch
            {
                return StatusCode(500);
            }
        }

И метод проверки при необходимости

 private static bool Check(string filePath, string mimeType)
        {
            return AllowedImageExts.Contains(GetFileExtension(filePath)) &&
                   AllowedImageMimetypes.Contains(mimeType.ToLower());
        }

Код не работает, когда я делаю:

await file.CopyToAsync(memoryStream)

Может кто-нибудь помочь мне здесь. Я потерян.

ОБНОВЛЕНИЕ 1 Я только что попытался исправить это с предложенным ответом, поэтому мой код теперь выглядит так:

[HttpPost, ActionName("Upload")]
        public async Task<IActionResult> Upload([FromForm]IFormFile file)
        {
            try
            {
                if (file == null)
                    return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");

                var memoryStream = new MemoryStream();
                await file.CopyToAsync(memoryStream);
                var filesCount = Request.Form.Files.Count;
                if (!Request.ContentType.StartsWith(MultipartContentType))
                    return BadRequest("Contenttype er ikke korrekt");

                if (filesCount == 0)
                    return BadRequest("Ingen fil fundet");

                // Get HTTP posted file based on the fieldname. 

                // Check if the file is valid.
                if (!Check(file.FileName, file.ContentType))
                    return BadRequest("Fil ikke gyldig");


                var medie = new Medie
                {
                    Name = file.FileName.Trim('\"'),
                    ParentId = _imageService.TempFolderGuid,
                    ContentLength = file.Length,
                    Content = memoryStream.ToArray()
                };

                try
                {
                    var imageId = await _imageService.Medier_InsertMedie(medie);

                    //TODO Her skal vi gemme ImageId i Session


                    return Json(new
                    {
                        location = $"/api/media/{imageId.Id}.jpg"
                    });
                }
                catch
                {
                    return BadRequest("Kunne ikke gemme billede");
                }
            }
            catch
            {
                return StatusCode(500);
            }
        }

Входной параметр больше не равно null, но все равно выдает то же исключение

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Мне кажется, что я должен написать, как я решил это

Проблема заключалась в том, что у меня есть журнал промежуточного программного обеспечения, который читает httpcontext. Используя ответ, найденный здесь: Как я могу прочитать тело http-запроса в netcore 3 более одного раза? решил эту проблему для меня.

0 голосов
/ 09 января 2020

Вы указали, что inputFile всегда равно нулю.

Привязка соответствует файлам формы по имени.

Ссылка Загрузка файлов в ASP. NET Core

На основании

// Get HTTP posted file based on the fieldname. 
var file = Request.Form.Files.GetFile("file");

имя опубликованного поля: "file"

, переименуйте параметр действия для соответствия и явно укажите, когда связать данные, используя [FromForm]

[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload([FromForm]IFormFile file) {
    try {
        if (file == null)
            return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");

        // Check if the file is valid.
        if (!Check(file.Name, file.ContentType))
            return BadRequest("Fil ikke gyldig");

        var medie = new Medie {
            Name = file.Name.Trim('\"'),
            ParentId = _imageService.TempFolderGuid
        };

        var fileStream = file.OpenStreamRead();
        using (var memoryStream = new MemoryStream()) {
            await fileStream.CopyToAsync(memoryStream);
            medie.Content = memoryStream.ToArray();
            medie.ContentLength = memoryStream.Length,
        }

        try {
            var imageId = await _imageService.Medier_InsertMedie(medie);

            //TODO Her skal vi gemme ImageId i Session

            return Json(new {
                location = $"/api/media/{imageId.Id}.jpg"
            });
        } catch {
            return BadRequest("Kunne ikke gemme billede");
        }
    } catch {
        return StatusCode(500);
    }
}
...