Как использовать «Azure хранилища больших двоичных объектов» для метода POST в контроллере - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю приложение, в котором пользователь может загрузить свой текстовый файл и узнать о его наиболее часто используемом слове.

Я пытался следовать этому действию c, чтобы привыкнуть к идее использования AZURE BLOBS ХРАНЕНИЯ - https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet

Но я супер новичок ie, и мне трудно понять, как адаптировать эти методы BLOB-объектов для моего метода POST.

Это мое sudo - то, что мне нужно в моем контроллере и что должно произойти, когда запускается метод POST.

a. Нет необходимости в DELETE или PUT, не заменяя данные и не удаляя в этом приложении

b. Может понадобиться метод GET, но как только метод POST запущен, он должен передать текстовый контекст компоненту FE

Метод POST

  1. connect с azure учетной записью хранения
  2. , если это первый раз POST, создайте контейнер для хранения текстового файла a. как я могу соединиться с существующим контейнером, если новый контейнер уже сделан? Я нашел это, но это для старого CloudBlobContainer. Не новая версия SDK 12.
.GetContainerReference($"{containerName}");
загрузить текстовый файл в контейнер получить текст выбранного файла и вернуть

И вот мой контроллер.

public class HomeController : Controller
    {
        private IConfiguration _configuration;

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

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

        [HttpPost("UploadText")]
        public async Task<IActionResult> Post(List<IFormFile> files)
        {
            if (files != null)
            {
                try
                {
                    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

                    BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

                    string containerName = "textdata" + Guid.NewGuid().ToString();

                    BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);

                    //Q. How to write a if condition here so if the POST method has already triggered and container already created, just upload the data. Do not create a new container?

                    string fileName = //Q. how to get the chosen file name and replace with newly assignmed name?
                    string localFilePath = //Q. how to get the local file path so I can pass on to the FileStream?

                    BlobClient blobClient = containerClient.GetBlobClient(fileName);

                    using FileStream uploadFileStream = System.IO.File.OpenRead(localFilePath);
                    await blobClient.UploadAsync(uploadFileStream, true);
                    uploadFileStream.Close();

                    string data = System.IO.File.ReadAllText(localFilePath, Encoding.UTF8);

                    //Q. If I use fetch('Home').then... from FE component, will it receive this data? in which form will it receive? JSON?
                    return Content(data);
                }
                catch
                {
                    //Q. how to use storageExeption for the error messages
                }
                finally
                {
                    //Q. what is suitable to execute in finally? return the Content(data) here?
                    if (files != null)
                    {
                        //files.Close();
                    }
                }
            }
            //Q. what to pass on inside of the Ok() in this scenario?
            return Ok();


        }

    }

Q1. Как я могу проверить, был ли метод POST уже запущен и создал Контейнер? Если так, как я могу получить имя контейнера и подключиться к нему?

Q2. Должен ли я дать новое присвоенное имя для выбранного файла? Как я могу это сделать?

Q3. Как я могу получить имя выбранного файла, чтобы передать его для обработки Q2?

Q4. Как получить локальный путь к файлу, чтобы я мог перейти к FileStream?

Q5. Как вернуть данные Контента и передать в ИП? используя fetch('Home').then... как это?

Q6. Как я могу использовать storageExeption для сообщений об ошибках

Q7. Что подходит для выполнения в конце концов? вернуть содержимое (данные) сюда?

Q8. Что передать внутри Ok () в этом сценарии?

Любая помощь приветствуется! Я знаю, что задавал много вопросов здесь. Большое спасибо!

1 Ответ

1 голос
/ 14 апреля 2020

Обновление: добавьте пример кода, вы можете изменить его по своему усмотрению.

   [HttpPost]
    public async Task<IActionResult> SaveFile(List<IFormFile> files)
    {
        if (files == null || files.Count == 0) return Content("file not selected");

        string connectionString = "xxxxxxxx";
        BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

        string containerName = "textdata" + Guid.NewGuid().ToString();;
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        containerClient.CreateIfNotExists();

        foreach (var file in files)
        {
            //use this line of code to get file name
            string fileName = Path.GetFileName(file.FileName);
            BlobClient blobClient = containerClient.GetBlobClient(fileName);

            //directly read file content
            using (var stream = file.OpenReadStream())
            {
                await blobClient.UploadAsync(stream);
            }
        }

        //other code

        return View();
    }

Оригинальный ответ:

При использовании List<IFormFile> вы должны использовать кодовый блок foreach для итерации каждого файла в списке.

Q2. Должен ли я дать новое присвоенное имя для выбранного файла? Как я могу это сделать?

Если вы хотите сохранить оригинальное имя файла, в выражении foreach, как показано ниже:

                foreach (var file in myfiles)
                {
                    Path.GetFileName(file.FileName)

                     //other code
                 }

И если вы хотите назначить новый файл имя при загрузке в хранилище BLOB-объектов, вы должны определить новое имя в этой строке кода: BlobClient blobClient = containerClient.GetBlobClient("the new file name").

Q3. Как я могу получить имя выбранного файла, чтобы передать его для обработки Q2?

см. Q2.

Q4. Как получить локальный путь к файлу, чтобы я мог передать его в FileStream?

Вы можете использовать код, подобный следующему: string localFilePath = file.FileName;, чтобы получить путь, а затем объединить с именем файла. Но есть и лучший способ, вы можете напрямую использовать эту строку кода Stream uploadFileStream = file.OpenReadStream().

Q5. Как вернуть данные Контента и передать в ИП? используя fetch ('Home'). затем ... как это?

Не ясно, что это значит. Можете ли вы предоставить более подробную информацию?

Q6. Как использовать storageExeption для сообщений об ошибках

В последней версии storageExeption не существует, следует установить более старую версию.

Вы можете обратиться по этой ссылке для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...