Загрузка файлов с использованием HttpClient в консольном приложении. Net core 3.0 - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь загрузить файл с помощью HttpClient в Asp. net Core 3, но он не загружает файл на сервер. Если я пытаюсь загрузить файл на сервер через почтальона, он работает.

Буду признателен за любую помощь.

Ниже приведен мой простой код для загрузки файла.

        HttpClient _client = new HttpClient();
        var stream = new FileStream("main.txt", FileMode.Open);
        byte[] fileBytes = new byte[stream.Length];
        stream.Write(fileBytes, 0, (int)stream.Length);
        stream.Dispose();


        using (var content = new MultipartFormDataContent())
        {
            var fileContent = new ByteArrayContent(fileBytes);
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "Test",

            };
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
            content.Add(fileContent);

            _client.PostAsync("http://192.168.56.1:8000", content);                
        }

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

enter image description here

enter image description here

когда я отлаживаю код, я получаю ошибку ниже.

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Одним из решений является то, что вы можете использовать MemoryStream для преобразования содержимого файла. Ваш метод приведет к тому, что содержимое файла main.txt станет пустым.

Измените ваш код следующим образом:

HttpClient _client = new HttpClient();
Stream stream = new FileStream("main.txt", FileMode.Open);​ 
MemoryStream ms = new MemoryStream();​
stream.CopyTo(ms);​
byte[] fileBytes = ms.ToArray();​
ms.Dispose(); ​

Другой способ заключается в использовании System.IO.File.ReadAllBytes(filePath).

Попробуйте опубликовать файл, используя приведенный ниже пример кода, см. Мой ответ .

using (var client = new HttpClient())
        {
            using (var content = new MultipartFormDataContent())
            {

                //replace with your own file path, below use an txt in wwwroot for example
                string filePath = Path.Combine(_hostingEnvironment.WebRootPath, "main.txt");

                byte[] file = System.IO.File.ReadAllBytes(filePath);

                var byteArrayContent = new ByteArrayContent(file);

                content.Add(byteArrayContent, "file", "main.txt");

                var url = "https://localhost:5001/foo/bar";
                var result = await client.PostAsync(url, content);

            }
        }

действие foo / bar

[HttpPost]
[Route("foo/bar")]
public IActionResult ProcessData([FromForm]IFormFile file)
{
     //your logic to upload file
}
0 голосов
/ 13 февраля 2020

Я скачал сервер и проверил его с помощью этого кода. Сервер возвращает 200 OK

using (var client = new HttpClient())
{
   using (var content = new MultipartFormDataContent())
   {
      using (var fileStream = new FileStream("test.txt", FileMode.Open))
      {
         var fileContent = new StreamContent(fileStream);

          content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
          content.Add(fileContent, "file", "test.txt");

          var response = await client.PostAsync("http://192.168.56.1:8000/", content);
       }
   }
}
...