Неспособность правильно прочитать содержимое файла IFormFile - PullRequest
0 голосов
/ 27 октября 2019

У меня есть веб-форма, которая представляет собой просто файл ввода, где пользователь может отправлять XML-файлы, которые отправляются в мой API.

Моя проблема возникает при попытке прочитать эти файлы в XmlDocument,Я правильно передаю содержимое в виде строки, но при загрузке в мой xmlFile я получаю сообщение об ошибке, в котором говорится, что синтаксис неверен (хотя все выглядит так же, как в моем исходном файле).

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

Контроллер:

public ActionResult ReadFiles()
    {            
        IFormFileCollection selectedFiles = Request.Form.Files;

        MemoryStream ms = new MemoryStream();
        List<IFormFile> fileList = selectedFiles.ToList();
        string[] fileNames = fileList.Select(x => x.FileName).ToArray();
        int i = 0;

        RestRequest request = new RestRequest(Method.POST);
        RestClient client = new RestClient("-EndPoint-");
        request.AlwaysMultipartFormData = true;
        request.AddHeader("Content-Type", "multipart/form-data");

        foreach (IFormFile file in fileList)
        {
            file.CopyTo(ms);
            request.AddFile("components", ms.ToArray(), fileNames[i]);
            i++;
        }


        IRestResponse response = client.Execute(request);   
    }

В моем API I 'мы пробовали разные вещи:

Попытка # 1

[HttpPost]
            public string Checks(IFormFileCollection components)
            {

                XmlDocument xmlFile = new XmlDocument();
                string[] arrFileNames = components.Select(x => x.FileName).ToArray();
                int fileNameCounter = 0;
                MemoryStream ms = new MemoryStream();
                List<IFormFile> fileList = components.ToList();

                foreach (IFormFile file in fileList)
                {
                    using (MemoryStream fileStream = new MemoryStream())
                    {
                        file.CopyTo(fileStream);
                        byte[] bytes = fileStream.ToArray();
                        string xmlString = Encoding.UTF8.GetString(bytes);
                        xmlFile.Load(xmlString);
                        //Do Work
                    }

Попытка # 2

                StringBuilder xaml = new StringBuilder();
                using (var reader = new StreamReader(file.OpenReadStream()))
                {
                    while (reader.Peek() >= 0)
                        xaml.AppendLine(reader.ReadLine());
                }
                string xamlString = xaml.ToString();
                xmlFile.Load(xamlString);

                //Do Work
            }

Попытка 3

XmlDocument xml = new XmlDocument();
            using (MemoryStream ms = new MemoryStream())
            {
                fileList[0].CopyTo(ms);
                xml.Load(Encoding.UTF8.GetString(ms.ToArray()));

            }

Все остальное я пытаюськажется, приводит меня к той же проблеме. Когда я отлаживаю код, строка верна с моим полным XML-файлом:

Строка отладки

Но когда я пытаюсь загрузить в свой XML, я получаю эту ошибку: Debug Xml

Похоже, что по какой-то причине он принимает часть исходного пути к файлу со строкой или чем-то еще, но даже когда я пытаюсь вручную извлечь эту строку, он все равно даетта же ошибка.

Я что-то упускаю здесь очевидное?

Большое спасибо

1 Ответ

0 голосов
/ 29 октября 2019

Я обнаружил, что одним из решений было использование XDocument вместо XmlDocument, который теперь все отлично работает!

...