0

初めてapi-platformを使用し、ファイルをアップロードする最良の方法を探しています。

私の状況:サーバー側でOneToMany関係「Media」(SonataMedia)を持つエンティティ「Post」、ビューの作成(Angular + Restangular)に取り組んでいます。

すべてのフィールド (ファイル タイプ フィールドを除く) は機能します (永続化 OK)。さて、ファイルの種類のフィールドについては、どうすればよいでしょうか?

  • 非同期アップロード?この場合、ファイルのアップロードを私のエンティティにリンクする方法 (まだ永続化されていません)

  • フォーム エンティティの送信時にファイルをアップロードしますか?

いずれの場合も、サーバーに送信する必要があるものは何ですか? Api プラットフォームはどのように管理しますか?

4

1 に答える 1

3

API プラットフォームの執筆時点では、組み込みのファイル アップロード サポートはありません。アップロードを処理するには、独自のコードを記述する必要があります。ただし、この機能をネイティブに追加するためにいくつかの作業が行われており、既に使用できます。

基本的に、アイデアは次のとおりです。

  1. クライアント側の URIとしてアップロードするファイルをエンコードしますdata:(JavaScript を使用)
  2. Restangular (またはその他の HTTP クライアント) を使用して、このデータ URI (基本的には base64 文字列) を典型的な文字列エンティティ プロパティとして送信します。
  3. data:Symfony Serializer を使用してサーバー側の URI を通常のファイルにデコードする
  4. この通常のファイルをサーバーに保存します。ファイルシステムに保存するか、Mongo GridFS や Amazon S3 などのより高度なバックエンドに保存するかはユーザー次第です。

クライアント側

選択したファイルからクライアント側の URIを取得するには、JavaScript APIにdata:依存できます: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL。Restangular を使用して、結果の文字列を通常どおり送信します。readAsDataURLFileReader

サーバ側

API プラットフォームの正規化システムは、Symfony シリアライザーの上に構築されています。data:Symfony に URI ノーマライザーとデノーマライザーを提供しました: https://github.com/symfony/symfony/pull/16164 まだマージされていませんが、その間に自分のプロジェクトにコピーできます。

ノーマライザーを登録します。

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

ItemNormalizer次に、API プラットフォームを装飾する新しいノーマライザーを作成 (および登録) して、メソッドを使用してdata:URI としてエンコードされたファイルを含むプロパティを標準に変換します。\SplFileObjectDataUriNormalizer::denormalize()

API プラットフォームの将来のバージョン (Symfony 3.1 で v2.1 を予定) では、このすべてのロジックが自動的に利用可能になり、登録されます。

于 2015-12-29T12:06:13.600 に答える