System.ObjectDisposedException: "Cannot access a closed file." после ожидания отправки потока

Рейтинг: 0Ответов: 1Опубликовано: 14.05.2023

Ребят, такая проблема. Есть метод для отправки картинок в хранилище.

string path = "images/";
bucketName = "myBucketName";

public void UploadImage(IFormFile formFile, string name)
{
    var request = new PutObjectRequest()
    {
        Key = $"{path}{name}",
        InputStream = formFile.OpenReadStream(),
        BucketName = bucketName,
    };

    request.Metadata.Add("Content-Type", formFile.ContentType);

    client.PutObjectAsync(request);
}

Вызываю его в тестовом консольном приложении, все работает, картинка отправляется на сервер. Но если вызываю его в asp.net проекте в Post методе.

[HttpPost]
public IActionResult Edit(ServiceItem model, IFormFile titleImageFile)
{
    if(Model.IsValid)
    {
        if (titleImageFile != null)
        {
            dataManager.ImageHandler.UploadImage(titleImageFile, model.Id.ToString());
            return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).CutController());
        }

        dataManager.ServiceItems.SaveServiceItem(model);
        return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).CutController());
    }
    return View(model);
}

Выбрасывает исключение System.ObjectDisposedException: "Cannot access a closed file.". В Startup есть связанный с ним код.

services.AddTransient<IImageHandlerRepository>(x =>
{
    return new AWSImageRepository(new AmazonS3Client(Config.AWSAccesToken, Config.AWSSecretAccesToken, new AmazonS3Config()
    {
        ForcePathStyle = true,
        RegionEndpoint = RegionEndpoint.EUWest1,
        ServiceURL = Config.ServiceURL
    }), Config.BucketName);
});

Как исправить эту ошибку? Буду благодарен любой помощи.

Ответы

▲ 1Принят

Асинхронность, client.PutObjectAsync вызван неверно

public Task UploadImageAsync(IFormFile formFile, string name)
{
    var request = new PutObjectRequest()
    {
        Key = $"{path}{name}",
        InputStream = formFile.OpenReadStream(),
        BucketName = bucketName,
    };

    request.Metadata.Add("Content-Type", formFile.ContentType);

    return client.PutObjectAsync(request);
}
await dataManager.ImageHandler.UploadImageAsync(titleImageFile, model.Id.ToString());