Как я могу загрузить файл CSV в виде потока, используя HttpClient в качестве параметра тела?

Я пытался преобразовать CSV-файл в contentStream с помощью кода ниже.

private const string ResourceFolder = "TestData\\";
private HttpContent _form;

      public void SendFile(string resource, string fileName)
    {
        _form = string.IsNullOrWhiteSpace(fileName)
            ? _form = new StringContent(string.Empty)
            : _form = new StreamContent(File.OpenRead($"{ResourceFolder}{fileName}"));

        var content = new MultipartFormDataContent();
           content.Add(_form);
        _form.Headers.ContentType = new MediaTypeHeaderValue("application/csv");

        WhenThePostRequestExecutesWithContent(resource, content);

    }

    public async void WhenThePostRequestExecutesWithContent(string resource, HttpContent content)
    {
        ResponseMessage = await HttpClient.PostAsync(resource, content);
    }

Я использую .Net core 2.1, и ниже выдается ошибка в последней строке в локации File.

Проблема в том, что я все еще нахожу null для параметра файла контроллера ниже,

Контроллер:

public async Task<IActionResult> SeedData(IFormFile file)
{
    var result = await _seedDataService.SeedData(file);
    return Ok(new { IsUploadSuccesful = result});
}

Компилятор преобразует File в System.IO.File, потому что никакая перегрузка метода File не соответствует вашим аргументам (Stream, string, Stream). Как вы думаете, зачем вообще нужен MemoryStream здесь?

Jeroen Mostert 22.05.2019 14:26

@JeroenMostert, мне нужно добавить этот поток в тело httpclient при последующем вызове

SMPH 22.05.2019 14:33

По какой причине вы не можете просто передать CSV-файл напрямую? File($"{ResourceFolder}{fileName}", "text/csv") должно хватить. Код, который у вас есть сейчас, на самом деле ничего не делает с потоком памяти. Если вы хотите прочитать файл в поток для дополнительной обработки, вам понадобится больше кода, чем сейчас (и тогда вы можете просто вернуть MemoryStream).

Jeroen Mostert 22.05.2019 14:36

@SMPH эта ошибка не имеет ничего общего с потоками. Это означает, что вы пытаетесь использовать метод Controller вне контроллера. В действии контроллера единственное, что вам нужно сделать, чтобы вернуть файл, хранящийся на диске, — это return File(pathToFile);.

Panagiotis Kanavos 22.05.2019 14:36

@SMPH Вы объявили поле с именем File в своем классе?

Panagiotis Kanavos 22.05.2019 14:42

@PanagiotisKanavos Нет, не видел.

SMPH 22.05.2019 14:46

@SMPH тогда опубликуйте остальную часть вашего кода. ControllerBase.Файл — допустимый метод. Вы можете просто использовать return File(someFolder, "text/csv"); в действии контроллера, чтобы вернуть файл.

Panagiotis Kanavos 22.05.2019 14:50

@PanagiotisKanavos По сути, я хотел добавить файл csv в качестве потока памяти в тело почтового вызова httpClient в своих тестах. С вышесказанным я пытался сделать это, следуя этому решению. https://stackoverflow.com/questions/15526507/convert-string-‌​to-stream . Возможно, мне не нужно этого делать. Не могли бы вы предложить лучшее решение?

SMPH 22.05.2019 14:55

@SMPH HttpClient — это совершенно другая библиотека. Есть много повторяющихся вопросов SO, которые показывают, как вы можете опубликовать или загрузить файл с помощью HttpClient. Код, который вы использовали, генерирует Результаты для контроллеров MVC.

Panagiotis Kanavos 22.05.2019 14:59

@PanagiotisKanavos Обновлен вопрос с подчеркиванием кода.

SMPH 22.05.2019 15:03

@SMPH, вы не можете просто скопировать код и надеяться, что он сработает. Дело не только в том, что вам не нужен этот поток. StreamContent принимает любой поток. Вы можете открыть FileStream с помощью простого File.OpenRead(). Вы использовали "application/json" в качестве типа контента для файла CSV.

Panagiotis Kanavos 22.05.2019 15:14

@panagiotis, исправил код в csv, сой, это опечатка. Контроллер BTW API ожидает файл в качестве параметра тела. В моем коде streamContent работал, но в файле параметров отображается как null

SMPH 23.05.2019 00:13

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

SMPH 23.05.2019 01:22

Проверьте эту проблему С#: публикация модели из тела и файла как MultipartFormDataContent

Edward 23.05.2019 04:46

ffs, пожалуйста, не используйте исключение async void нигде в обработчиках пользовательского интерфейса Windows Forms и WPF.

Tseng 23.05.2019 09:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
1 053
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря вкладу каждого, приведенный ниже код решил проблему.

private const string ResourceFolder = "TestData\\";
private HttpContent _form;

     public void AttachedRatesFile(string fileName)
        {
            _form = string.IsNullOrWhiteSpace(fileName)
                ? _form = new StringContent(string.Empty)
                : _form = new StreamContent(File.OpenRead($"{ResourceFolder}{fileName}"));

            _content = new MultipartFormDataContent();
            _content.Add(_form, "file", fileName);
            _form.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

        }


    public async void WhenThePostRequestExecutesWithContent(string resource, HttpContent content)
    {
        ResponseMessage = await HttpClient.PostAsync(resource, content);
    }

Другие вопросы по теме