API POST вызывает для загрузки списка объектов, содержащих IFormFile - PullRequest
0 голосов
/ 22 октября 2018

Я использую IFormFile из ASP.NET Core 2.2 для создания вызова веб-службы загрузки файлов.Поскольку мне нужны конкретные данные, связанные с каждой загрузкой файла, я создал собственный класс модели, который будет содержать данные со свойством IFormFile.

public class Document
{
    public string FileId { get; set; }
    public string FileTitle { get; set; }
    public string CategoryId { get; set; }

    public IFormFile Content { get; set; }
}

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

[HttpPost]
[Route("UploadDoc")]
public async Task<IActionResult> DocumentUpload ([FromForm] Document document) { }

Однако я хочу принять список документов для загрузки сразу.Когда я настраиваю свой POST для принятия списка, он больше не работает.Я точно знаю, что IList<IFormFile> работает, но проблема в том, что мне нужны дополнительные данные для каждого файла.

[HttpPost]
[Route("UploadDoc")]
public async Task<IActionResult> DocumentUpload ([FromForm] IList<Document> document) { }

Я тестирую свой API с помощью Postman, и я включил скриншот своей формызвонокКогда выполнено, мой почтальон будет висеть.Как ни странно, когда я удаляю свойство IFormFile из моего класса Document, вызов работает.Могу ли я сделать эту работу или есть обходной путь?

Почтальон звонит

Ответы [ 4 ]

0 голосов
/ 22 января 2019

Это известная ошибка

В качестве обходного пути вы можете обернуть IFormFile в другой класс, и он будет работать

    public class Company
    {
        public IList<Person> Employees { get; set; } = new List<Person>();
    }

    public class Person
    {
        public FormFileWrapper IdImage { get; set; }
    }

    public class FormFileWrapper
    {
        public IFormFile File { get; set; }
    }

, тогда у вас нетдобавить индекс в ваш HTML

<form action="http://localhost:5000/api/Values" method="post" enctype="multipart/form-data">
    <p><input type="file" name="Employees[0].IdImage.File"></p>
    <p><input type="file" name="Employees[1].IdImage.File"></p>
    <p><button type="submit">Submit</button></p>
</form>
0 голосов
/ 23 октября 2018

Почему вы не можете попробовать конкретную реализацию IFormFile.И используйте этот конкретный тип в качестве параметра списка.

public class Document : IFormFile
{
    public string ContentType => throw new NotImplementedException();

    public string ContentDisposition => throw new NotImplementedException();

    public IHeaderDictionary Headers => throw new NotImplementedException();

    public long Length => throw new NotImplementedException();

    public string Name => throw new NotImplementedException();

    public string FileName => throw new NotImplementedException();

    public void CopyTo(Stream target)
    {
        throw new NotImplementedException();
    }

    public Task CopyToAsync(Stream target, CancellationToken cancellationToken = default(CancellationToken))
    {
        throw new NotImplementedException();
    }

    public Stream OpenReadStream()
    {
        throw new NotImplementedException();
    }
}

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

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

Это на самом деле ошибка в ASP.NET Core 2.2 , но есть обходной путь для этого.

Включите индекс элемента в сообщение формы, как это:

HTML-форма :

<input type="hidden" name="document.Index" value="0" />
<input type="file" name="document.Content[0]" />

<input type="hidden" name="document.Index" value="1" />
<input type="file" name="document.Content[1]" />

вызов API :

key                    value
document.Index         0
document.Content[0]    (binary)
document.Index         1
document.Content[1]    (binary)

Я создал Воспроизведение ошибки и включенного Обходное решение .

0 голосов
/ 23 октября 2018

Для передачи List Object от почтальона к API, вы можете попробовать struct как parameterName[index].fieldName.

Вот демонстрация, которая работает для вас.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...