Не удалось загрузить файл с эмулятором, проблема с контроллером

#c# #.net #azure #asp.net-core #blob

Вопрос:

Я пытаюсь создать галерею больших двоичных объектов в VS2019. Я создал жереха .Проект NET core (MVC) с конфигурацией HTTPS, .NET Core 3.1 и без аутентификации. У меня есть хранилище больших двоичных объектов в Azure, но в этом проекте я использую обозреватель хранилища Azure с включенным эмулятором. Когда я начинаю проект, он показывает мне хорошую html-страницу, и кнопка, которую я могу выбрать для загрузки, работает нормально, но когда я нажимаю кнопку загрузки, я получаю сообщение об ошибке «https: // localhost: 44330 / Home / UploadAsync». Я думаю, что это может быть связано с ошибкой, которую я не вижу в homecontroller, потому что я реализовал ее и html с файлами css.

Я добавлю, что соединение выполняется в appsettings.json файле с помощью команды "StorageConnectionString": "UseDevelopmentStorage=true" . После этого в эмуляторе я вижу новую папку, имя которой закрывается кодом. Я использую WindowsAzure.Упаковка для хранения.

Код домашнего контроллера:

 namespace WebApplication.Controllers
{
    public class HomeController : Controller
    {
       
        static CloudBlobClient _blobClient;
        const string _blobContainerName = "imagecontainer";
        private readonly IConfiguration _configuration;
        static CloudBlobContainer _blobContainer;

        public HomeController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public async Task<ActionResult> Index()
        {
            try
            {
                var storageConnectionString = _configuration.GetValue<string>("StorageConnectionString");
                var storageAccount = CloudStorageAccount.Parse(storageConnectionString);

                _blobClient = storageAccount.CreateCloudBlobClient();
                _blobContainer = _blobClient.GetContainerReference(_blobContainerName);
                await _blobContainer.CreateIfNotExistsAsync();

                await _blobContainer.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });

                List<Uri> allBlobs = new List<Uri>();
                BlobContinuationToken blobContinuationToken = null;
                do
                {
                    var response = await _blobContainer.ListBlobsSegmentedAsync(blobContinuationToken);
                    foreach (IListBlobItem blob in response.Results)
                    {
                        if (blob.GetType() == typeof(CloudBlockBlob))
                            allBlobs.Add(blob.Uri);
                    }
                    blobContinuationToken = response.ContinuationToken;
                } while (blobContinuationToken != null);

                return View(allBlobs);
            }
            catch (Exception ex)
            {
                ViewData["message"] = ex.Message;
                ViewData["trace"] = ex.StackTrace;
                return View("Error");
            }
        }

        [HttpPost]
        public async Task<ActionResult> UploadAsync()
        {
            try
            {
                var request = await HttpContext.Request.ReadFormAsync();
                if (request.Files == null)
                {
                    return BadRequest("Could not upload files");
                }
                var files = request.Files;
                if (files.Count == 0)
                {
                    return BadRequest("Could not upload empty files");
                }

                for (int i = 0; i < files.Count; i  )
                {
                    var blob = _blobContainer.GetBlockBlobReference(GetRandomBlobName(files[i].FileName));
                    using (var stream = files[i].OpenReadStream())
                    {
                        await blob.UploadFromStreamAsync(stream);

                    }
                }
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ViewData["message"] = ex.Message;
                ViewData["trace"] = ex.StackTrace;
                return View("Error");
            }
        }

        [HttpPost]
        public async Task<ActionResult> DeleteImage(string name)
        {
            try
            {
                Uri uri = new Uri(name);
                string filename = Path.GetFileName(uri.LocalPath);

                var blob = _blobContainer.GetBlockBlobReference(filename);
                await blob.DeleteIfExistsAsync();

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ViewData["message"] = ex.Message;
                ViewData["trace"] = ex.StackTrace;
                return View("Error");
            }
        }

        [HttpPost]
        public async Task<ActionResult> DeleteAll()
        {
            try
            {
                BlobContinuationToken blobContinuationToken = null;
                do
                {
                    var response = await _blobContainer.ListBlobsSegmentedAsync(blobContinuationToken);
                    foreach (IListBlobItem blob in response.Results)
                    {
                        if (blob.GetType() == typeof(CloudBlockBlob))
                            await ((CloudBlockBlob)blob).DeleteIfExistsAsync();
                    }
                    blobContinuationToken = response.ContinuationToken;
                } while (blobContinuationToken != null);

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ViewData["message"] = ex.Message;
                ViewData["trace"] = ex.StackTrace;
                return View("Error");
            }
        }

        
        private string GetRandomBlobName(string filename)
        {
            string ext = Path.GetExtension(filename);
            return string.Format("{0:10}_{1}{2}", DateTime.Now.Ticks, Guid.NewGuid(), ext);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
 

Комментарии:

1. можете ли вы поделиться html-контентом?

Ответ №1:

В вашем html-файле переименуйте действие в Upload вместо UploadAsync

 @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
 

Комментарии:

1. Большое вам спасибо, это помогло