Asp.Net Core API получает пустой IFormFile - PullRequest
0 голосов
/ 25 декабря 2018

Последние 2 дня я пытался создать систему загрузки изображений для моего сайта.Когда я пытаюсь сохранить загруженное изображение в «wwwroot» моего Api, все идет по плану, за исключением того, что я получаю пустое изображение в своей папке.

В бэкэнде я получаю имя файла, которое отправляю в веб-интерфейсе, но байтов самого изображения там нет.По какой-то причине данные потока, который я поместил в пост-вызове, отсутствуют, но я получаю имя файла в файле формы.

Редактировать :

Чтобы прояснить ситуацию с моим приложением, я работаю с Asp.Net Mvc в качестве внешнего интерфейса и Asp.Net Api в качестве внутреннего.Я знаю, что это не то, как вы должны использовать Asp.Net, но это школьный проект, и я должен сделать это так.Обычно я бы работал с Angular или чем-то еще, но сейчас это не вариант для меня.

Итак, я отправляю данные из Asp.Net Mvc (внешний интерфейс) в Asp.Net Api (внутренний интерфейс)) и я пытаюсь сделать это, отправив его в виде данных формы.Это означает, что нет реальной формы для отправки.

Это руководство, которое я пытался использовать: https://ilclubdellesei.blog/2018/02/14/how-to-upload-images-to-an-asp-net-core-rest-service-with-xamarin-forms/

Backend

ImageController:

[HttpPost("upload")]
public async Task<IActionResult> UploadImage([FromForm(Name = "file")] IFormFile file)
{
    if (file.Length == 0)
        return BadRequest("Empty file");

    string imageName = file.FileName;
    using (var fs = new FileStream("wwwroot/" + imageName, FileMode.Create, FileAccess.Write))
    {
        await file.CopyToAsync(fs);
    }

    return Ok();
}

Внешний интерфейс

Метод, который загружает 1 изображение в виде MemoryStream на сервер

private async Task<string> Upload(Stream image, string name, string contentType)
{
    _httpClient = _clientFactory.CreateClient("ProjectApi");

    HttpContent fileStreamContent = new StreamContent(image);
    fileStreamContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = name };
    fileStreamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(fileStreamContent);
        HttpResponseMessage response = await _httpClient.PostAsync("api/images/upload", formData);
        var input = await response.Content.ReadAsStringAsync();
        return input;
    }
}

Контент, похоже, небыть пустым:

enter image description here

Имя файла было успешно отправлено в API, но байты изображения не были отправлены:

enter image description here

Структура после загрузки некоторых изображений без проверки размера файла формы (они пусты):

The structure after uploading an image

1 Ответ

0 голосов
/ 26 декабря 2018

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

[Consumes("multipart/form-data")]
private async Task<string> Upload(Stream image, string name, string contentType)

И если вы забудете добавить атрибуты формы в раздел html, установите атрибуты следующим образом <form method="post" enctype="multipart/form-data">.Надеюсь, что это решит вашу проблему.

...