Как я могу загрузить файл 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
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
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);
    }

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