Как отправить загруженный файл .CSV в веб-сервис - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь выяснить, как отправить файл, загруженный из пользовательского интерфейса (угловой), и отправить его в веб-службу .NET, чтобы он проанализировал файл CSV и создал список объектов.

Моя текущая идея о том, как должна работать логика,

Загрузка файла ---> Веб-служба (для анализа файла) -> Веб-API ---> База данных

это правильно?

Чего мне не хватает, чтобы отправить этот файл в службу, а затем из службы в контроллер API?

HTML:

  <input type="file" (change)="onFileSelected($event)">
                <button type="submit" (click)="onUpload"   class="button">Upload</button>

Веб-сервис:

 static void Main(string[] args)
        {

            string currentDirectory = Directory.GetCurrentDirectory();
            DirectoryInfo directory = new DirectoryInfo(currentDirectory);
            var fileName = Path.Combine(directory.FullName, "sample-data.csv");
            var fileContents = ReadMonitoredEvent(fileName);
        }

        public static string ReadFile(string fileName)
        {
            using (var reader = new StreamReader(fileName))
            {
                return reader.ReadToEnd();
            }
        }


        public static List<MonitoredEvent> ReadMonitoredEvent(string fileName)
        {
            var monitoredEventResults = new List<MonitoredEvent>();
            using (var reader = new StreamReader(fileName))
            {
                string line = "";
                reader.ReadLine();
                while ((line = reader.ReadLine()) != null)
                {
                    var monitoredEvent = new MonitoredEvent();
                    string[] values = line.Split(',');              
                    DateTime eventDate;
                    TimeSpan eventTime;
                    float tlc;
                    float totalOrder;

                    //String.Format("{Short Date}", DateTime.Now);
                    if (DateTime.TryParse(values[3], out eventDate))
                    {
                        var date = eventDate.Date;
                        monitoredEvent.EventDate = date;
                    }
                    if(TimeSpan.TryParse(values[4], out eventTime))
                    {
                        monitoredEvent.Time = eventTime;
                    }
                    if (float.TryParse(values[6], out tlc))
                    {
                        monitoredEvent.TLC = tlc;
                    }
                    if (float.TryParse(values[5], out totalOrder))
                    {
                        monitoredEvent.TotalOrder = totalOrder;
                    }
                    monitoredEvent.Venue = values[0];
                    monitoredEvent.Event = values[1];
                    monitoredEvent.Section = values[2];
                    monitoredEvent.TicketType = values[7];
                    monitoredEvent.Source = values[8];
                    monitoredEvent.TicketPage = values[9];

                    monitoredEventResults.Add(monitoredEvent);

                }
            }
            return monitoredEventResults;


        }

У меня нет ни кода для контроллера, ни машинописи.

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

1 Ответ

0 голосов
/ 30 марта 2019

ваша логика почти верна, за исключением того, что вместо веб-службы, в которой мы используем Http Client на угловом языке, я предлагаю вам прочитать учебник, например this

ОБНОВЛЕНИЕ:

здесь есть функция для загрузки файла в веб-интерфейс. Код c #:

[HttpPost]
[Route("File/Post")]
public IHttpActionResult UploadFile()
{
   var httpRequest = HttpContext.Current.Request;
   var postedFile = httpRequest.Files["File"];
   //the parsing logic
   return Ok();
}

, а угловая часть:

postFile(fileToUpload: File) {
   const formData: FormData = new FormData();
   const tmpUrl=myUrl+"File/Post";
   formData.append("File", fileToUpload, fileToUpload.name);
   return this.http.post(tmpUrl, formData).pipe();
}

Я упростил, ноэтого достаточно, чтобы вы пошли

...