'ControllerBase.File (byte [], string)' - это метод, который недопустим в данном контексте (CS0119) - в методе - PullRequest
0 голосов
/ 30 марта 2020

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

Я использую React в качестве FE и ASP. NET Core для BE и Azure хранилище для хранилища базы данных.

Так выглядит мой HomeController. Я создал отдельный метод «UploadToBlob» для публикации данных

    public class HomeController : Controller
    {
        private readonly IConfiguration _configuration;

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

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

        [HttpPost("UploadFiles")]
        //OPTION B: Uncomment to set a specified upload file limit
        [RequestSizeLimit(40000000)]

        public async Task<IActionResult> Post(List<IFormFile> files)
        {
            var uploadSuccess = false;
            string uploadedUri = null;

            foreach (var formFile in files)
            {
                if (formFile.Length <= 0)
                {
                    continue;
                }

                // read directly from stream for blob upload      
                using (var stream = formFile.OpenReadStream())
                {
                    // Open the file and upload its data
                    (uploadSuccess, uploadedUri) = await UploadToBlob(formFile.FileName, null, stream);

                }

            }

            if (uploadSuccess)
            {
                //return the data to the view, which is react display text component.
                return View("DisplayText");
            }
            else
            {
                //create an error component to show there was some error while uploading
                return View("UploadError");
            }
        }

        private async Task<(bool uploadSuccess, string uploadedUri)> UploadToBlob(string fileName, object p, Stream stream)
        {
            if (stream is null)
            {
                try
                {
                    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

                    // Create a BlobServiceClient object which will be used to create a container client
                    BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

                    //Create a unique name for the container
                    string containerName = "textdata" + Guid.NewGuid().ToString();

                    // Create the container and return a container client object
                    BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);

                    string localPath = "./data/";
                    string textFileName = "textdata" + Guid.NewGuid().ToString() + ".txt";
                    string localFilePath = Path.Combine(localPath, textFileName);

                    // Get a reference to a blob
                    BlobClient blobClient = containerClient.GetBlobClient(textFileName);

                    Console.WriteLine("Uploading to Blob storage as blob:\n\t {0}\n", blobClient.Uri);

                    FileStream uploadFileStream = File.OpenRead(localFilePath);
                    await blobClient.UploadAsync(uploadFileStream, true);
                    uploadFileStream.Close();
                }
                catch (StorageException)
                {
                    return (false, null);
                }
                finally
                {
                    // Clean up resources, e.g. blob container
                    //if (blobClient != null)
                    //{
                    //    await blobClient.DeleteIfExistsAsync();
                    //}
                }
            }
            else
            {
                return (false, null);
            }

        }

    }

, но консоль выдает ошибки, говоря, что «'ControllerBase.File (byte [], string)' является недопустимым методом в данном контексте (CS0119) "

И из-за этой ошибки следует другая ошибка" HomeController.UploadToBlob (string, object, Stream) ': не все пути кода возвращают значение (CS0161) "

мои вопросы

  1. Лучше ли создать отдельный метод, как я?
  2. как я могу решить вопрос о том, что «Файл» действителен внутри метода UploadToBlob?
  3. Если я хочу добавить проверку типа файла, где это должно произойти? t.ex. alid * only text file
  4. Если я хочу прочитать текстовую строку из загруженного текстового файла, где я должен вызвать
  string contents = blob.DownloadTextAsync().Result;

  return contents;
Как передать "содержимое" моему компоненту реакции? что-то вроде этого?
    useEffect(() => {
        fetch('Home')
            .then(response => response.json())
            .then(data => {
                setForcasts(data)
            })
    }, [])

Спасибо за помощь этому суперновому ie с ASP. NET Core!

1 Ответ

2 голосов
/ 30 марта 2020

1) Допустимо помещать загрузку в отдельный метод, его также можно поместить в отдельный класс для обработки операций BLOB-объектов

2) File - это имя одного из методов контроллера, если вы хотите сослаться на класс File из пространства имен System.IO, вам нужно полностью указать имя

FileStream uploadFileStream = System.IO.File.OpenRead(localFilePath);

Для другой ошибки компиляции вам нужно вернуть что-то из метода UploadToBlob, сейчас он ничего не возвращает из блока try

3) Проверка типа файла может быть включена в метод действия контроллера

4) это зависит от того, что вы планируете делать с текстом и как ты собираешься его использовать. Будет ли это новое действие контроллера (новая конечная точка API)?

5) вы можете создать новую конечную точку API для загрузки файлов

ОБНОВЛЕНИЕ:

Для слова Для замены вы можете использовать аналогичный метод:

private Stream FindMostFrequentWordAndReplaceIt(Stream inputStream)
{
    using (var sr = new StreamReader(inputStream, Encoding.UTF8)) // what is the encoding of the text? 
    {
        var allText = sr.ReadToEnd(); // read all text into memory
        // TODO: Find most frequent word in allText
        // replace the word allText.Replace(oldValue, newValue, stringComparison)
        var resultText = allText.Replace(...);

        var result = new MemoryStream();
        using (var sw = new StreamWriter(result))
        {
            sw.Write(resultText);
        }
        result.Position = 0;
        return result;
    }
}

он будет использоваться в вашем методе Post следующим образом:

using (var stream = formFile.OpenReadStream())
{
    var streamWithReplacement = FindMostFrequentWordAndReplaceIt(stream);

    // Upload the replaced text:
    (uploadSuccess, uploadedUri) = await UploadToBlob(formFile.FileName, null, streamWithReplacement);

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