Загрузка файла JSF 2.0

У меня было это требование, потому что у меня есть объект Document, у которого есть поле Content с содержимым файла, то есть размером около 100 МБ, и у меня есть функция поиска, которую я хотел бы вернуть остальную часть столбцы.

Я решил использовать проецирование:

IQueryable<Document> results = dbContext.Documents.Include(o => o.UploadedBy).Select(o => new {
    Content = (string)null,
    ContentType = o.ContentType,
    DocumentTypeId = o.DocumentTypeId,
    FileName = o.FileName,
    Id = o.Id,
    // etc. even with related entities here like:
    UploadedBy = o.UploadedBy
});

Затем мой контроллер WebApi передает этот объект results в общую функцию Pagination, которая применяет .Skip, .Take и .ToList.

Это означает, что когда запрос выполняется, он не обращается к столбцу Content, поэтому данные 100 МБ не затрагиваются, и запрос выполняется так же быстро, как вы хотите / ожидаете, что это будет.

Затем я вернул его в мой класс DTO, который в этом случае почти точно такой же, как класс сущности, поэтому это может быть не шаг вам нужно реализовать, но это соответствует моему типичному шаблону кодирования WebApi, поэтому:

var dtos = paginated.Select(o => new DocumentDTO
{
    Content = o.Content,
    ContentType = o.ContentType,
    DocumentTypeId = o.DocumentTypeId,
    FileName = o.FileName,
    Id = o.Id,
    UploadedBy = o.UploadedBy == null ? null : ModelFactory.Create(o.UploadedBy)
});

Затем я возвращаю список DTO:

return Ok(dtos);

. Поэтому он использует проекцию, которая может не соответствуют требованиям оригинального плаката, но если вы используете классы DTO, вы все равно конвертируете. Вы можете так же легко сделать следующее, чтобы вернуть их в качестве ваших реальных объектов:

var dtos = paginated.Select(o => new Document
{
    Content = o.Content,
    ContentType = o.ContentType,
    DocumentTypeId = o.DocumentTypeId,
    //...

Всего несколько дополнительных шагов, но это работает для меня хорошо.

33
задан BalusC 9 March 2016 в 21:50
поделиться