2015-12-29 8 views
-1

Я использую api-platform в первый раз, и я ищу лучший способ для загрузки файлов.Лучший способ загрузить файлы с помощью Restangular + Api-platform (Symfony2)

Мое положение: Сущность «Почта» с отношением OneToMany «Медиа» (SonataMedia) на стороне сервера, я работаю над созданием вида (Угловое + рестатулярное).

Все поля (кроме полей типа файла) являются функциональными (сохраняются в порядке). Теперь, для полей типа файла, что мне нужно делать?

  • Асинхронная загрузка? в этом случае, как связать загрузку файлов с моей сущностью (которые еще не сохраняются)

  • Загрузить файлы на форме entity submit?

В каждом случае, что нужно отправить на сервер? Как Api-платформа управляет им?

Если бы вы были в той же ситуации, мне бы хотелось ваше мнение.

спасибо!

ответ

3

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

В принципе, идея:

  1. Encode файл для загрузки в data: URI на стороне клиента (с помощью JavaScript)
  2. Отправить данные URI (в основном base64 строка) в качестве типичного свойства String объекта используя Restangular (или любой другой HTTP-клиент)
  3. Расшифруйте data: URI на стороне сервера в обычный файл с помощью Symfony Serializer
  4. магазин это обычный файл на сервере: это до вас, чтобы сохранить его в файловой системе или в Больше современные движки, такие как Mongo GridFS или Amazon S3

стороне клиента

Чтобы получить data: URI на стороне клиента из выбранного файла, вы можете рассчитывать на readAsDataURL в API FileReader JavaScript: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL , Отправьте полученную строку, как обычно, с помощью Restangular.

Серверный

Система Платформа нормализации API построен на вершине Symfony Serializer. Я внедрил нормализатор и denormalizer URI data: в Symfony: https://github.com/symfony/symfony/pull/16164 Он еще не слит, но вы можете его скопировать в свой собственный проект за это время.

Регистрация нормализатор:

services: 
    data_uri_normalizer: 
     class: 'AppBundle\Serializer\DataUriNormalizer' 
     tags: 
      - { name: serializer.normalizer } 

Затем создайте (и регистр) новый нормализатор украшающие ItemNormalizer из API платформы превратить ваше свойство, содержащее файл, закодированный как data: URI к стандартному \SplFileObject с использованием метода DataUriNormalizer::denormalize() ,

В будущей версии платформы API (планируется для версии 2.1 с Symfony 3.1) вся эта логика будет автоматически доступна и зарегистрирована.