0

我第一次使用api-platform,我正在寻找上传文件的最佳方式。

我的情况:在服务器端具有 OneToMany 关系“Media”(SonataMedia)的实体“Post”,我正在创建视图(Angular + Restangular)。

所有字段(文件类型字段除外)都可以正常工作(保持正常)。现在,对于文件类型字段,我需要做什么?

  • 异步上传?在这种情况下,如何将文件上传与我的实体链接(尚未持久化)

  • 在表单实体上上传文件提交?

在每种情况下,它需要向服务器发送什么?Api-platform 如何管理它?

4

1 回答 1

3

在编写 API 平台时,没有内置的文件上传支持。您需要编写自己的代码来处理上传。但是,有些工作是为了本地添加此功能而做的一些工作,您已经可以使用它了。

基本上,这个想法是:

  1. 将要上传的文件编码为data:URI 客户端(使用 JavaScript)
  2. 使用 Restangular(或任何其他 HTTP 客户端)将此数据 URI(基本上是 base64 字符串)作为典型的字符串实体属性发送
  3. data:使用 Symfony 序列化器将 URI 服务器端解码为常规文件
  4. 将此常规文件存储在服务器上:您可以将其存储在文件系统或更高级的后端,例如 Mongo GridFS 或 Amazon S3

客户端

要从选定文件获取URI 客户端,data:您可以依赖JavaScript API: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 }

然后创建(并注册)一个新的规范器来装饰API 平台,以使用该方法ItemNormalizer将包含编码为data:URI 的文件的属性转换为标准。\SplFileObjectDataUriNormalizer::denormalize()

在 API 平台的未来版本(计划用于带有 Symfony 3.1 的 v2.1)中,所有这些逻辑都将自动可用并注册。

于 2015-12-29T12:06:13.600 回答