Я пытался преобразовать 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});
}
@JeroenMostert, мне нужно добавить этот поток в тело httpclient при последующем вызове
По какой причине вы не можете просто передать CSV-файл напрямую? File($"{ResourceFolder}{fileName}", "text/csv")
должно хватить. Код, который у вас есть сейчас, на самом деле ничего не делает с потоком памяти. Если вы хотите прочитать файл в поток для дополнительной обработки, вам понадобится больше кода, чем сейчас (и тогда вы можете просто вернуть MemoryStream
).
@SMPH эта ошибка не имеет ничего общего с потоками. Это означает, что вы пытаетесь использовать метод Controller
вне контроллера. В действии контроллера единственное, что вам нужно сделать, чтобы вернуть файл, хранящийся на диске, — это return File(pathToFile);
.
@SMPH Вы объявили поле с именем File
в своем классе?
@PanagiotisKanavos Нет, не видел.
@SMPH тогда опубликуйте остальную часть вашего кода. ControllerBase.Файл — допустимый метод. Вы можете просто использовать return File(someFolder, "text/csv");
в действии контроллера, чтобы вернуть файл.
@PanagiotisKanavos По сути, я хотел добавить файл csv
в качестве потока памяти в тело почтового вызова httpClient в своих тестах. С вышесказанным я пытался сделать это, следуя этому решению. https://stackoverflow.com/questions/15526507/convert-string-to-stream
. Возможно, мне не нужно этого делать. Не могли бы вы предложить лучшее решение?
@SMPH HttpClient — это совершенно другая библиотека. Есть много повторяющихся вопросов SO, которые показывают, как вы можете опубликовать или загрузить файл с помощью HttpClient. Код, который вы использовали, генерирует Результаты для контроллеров MVC.
@PanagiotisKanavos Обновлен вопрос с подчеркиванием кода.
@SMPH, вы не можете просто скопировать код и надеяться, что он сработает. Дело не только в том, что вам не нужен этот поток. StreamContent
принимает любой поток. Вы можете открыть FileStream с помощью простого File.OpenRead()
. Вы использовали "application/json"
в качестве типа контента для файла CSV.
@panagiotis, исправил код в csv, сой, это опечатка. Контроллер BTW API ожидает файл в качестве параметра тела. В моем коде streamContent работал, но в файле параметров отображается как null
@PanagiotisKanavos Я обновил код, как было предложено в вопросе, чтобы он был более понятным, и все же параметр пустого файла в контроллере меня беспокоит.
Проверьте эту проблему С#: публикация модели из тела и файла как MultipartFormDataContent
ffs, пожалуйста, не используйте исключение async void
нигде в обработчиках пользовательского интерфейса Windows Forms и WPF.
Благодаря вкладу каждого, приведенный ниже код решил проблему.
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);
}
Компилятор преобразует
File
вSystem.IO.File
, потому что никакая перегрузка методаFile
не соответствует вашим аргументам (Stream, string, Stream
). Как вы думаете, зачем вообще нуженMemoryStream
здесь?