Загрузите файлы Zip в службу ASP.NET Core WebAPI с помощью HttpClient, но аргумент IFormData всегда равен нулю - PullRequest
0 голосов
/ 02 июля 2019

, как написано в заголовке, я пытаюсь загрузить .zip из моего приложения WPF в мой .NET Core Web API.

После некоторого исследования я обнаружил, что можно сделать с помощью MultiPartDataContent и отправить его таким образом.

Код для отправки данных на сервер выглядит следующим образом:

            {
                client.BaseAddress = new Uri("http://localhost:62337/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                string filepath = @"C:\Users\uic10950\Desktop\Meeting2Text\RecordingApp\bin\mixedaudio.zip";
                string filename = "mixedaudio.zip";

                MultipartFormDataContent content = new MultipartFormDataContent();
                ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
                content.Add(fileContent);

                HttpResponseMessage response = await client.PostAsync("api/transcriptions/recording", content);
                string returnString = await response.Content.ReadAsAsync<string>();
            }

На стороне сервера мое действие контроллера выглядит следующим образом:

        public async Task<IActionResult> AddFileToTranscription([FromForm] IFormFile file)
        {
            using (var sr = new StreamReader(file.OpenReadStream()))
            {
                var content = await sr.ReadToEndAsync();
                return Ok(content);
            }
        }

Этот код действия будет изменен, как только я получу загрузку файла, работающую

Из того, что яПри исследовании я понял, что мой файл должен быть найден в:

[FromForm] IFormFile

атрибуте файла действия, но, к сожалению, он нулевой.

1 Ответ

1 голос
/ 02 июля 2019

Вы делаете неправильно несколько вещей:

public async Task<IActionResult> AddFileToTranscription([FromForm] IFormFile file)

❌ Вам не нужен атрибут [FromFile].

❌ Имя аргумента вашего файла file, но у вас нетНе определяйте его при загрузке файлов в клиенте.

❌ Вам не нужно добавлять ContentDisposition и устанавливать его как attachment, потому что это для ответа, а не запроса!(1)


✅ Сервер:

public async Task<IActionResult> AddFileToTranscription( IFormFile file)
{
    using (var sr = new StreamReader(file.OpenReadStream()))
    {
        var content = await sr.ReadToEndAsync();
        return Ok(content);
    }
}

✅ Клиент:

client.BaseAddress = new Uri("http://localhost:62337/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

string filepath = @"C:\Users\uic10950\Desktop\Meeting2Text\RecordingApp\bin\mixedaudio.zip";
string filename = "mixedaudio.zip";

MultipartFormDataContent content = new MultipartFormDataContent();
ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

// ➡ ✅ important change fileContent, form-input-name, real-file-name
content.Add(fileContent, "file", filename);

HttpResponseMessage response = await client.PostAsync("api/transcriptions/recording", content);
string returnString = await response.Content.ReadAsAsync<string>();

MultipartFormDataContent.Add метод имеет несколько перегрузок для добавления данных формы, вы должны использовать эту перегрузку :

public void Add (System.Net.Http.HttpContent content, string name, string fileName);

Вывод:

Каким бы ни был ваш аргумент IFormData, вам нужно загружать или отправлять запросы, которыеname!


  1. В обычном HTTP-ответе заголовок ответа Content-Disposition является заголовком, указывающим, будет ли содержимое отображаться встроенным в браузере, чтокак веб-страница или как часть веб-страницы, или как вложение, которое загружается и сохраняется локально.
...