使用Restangular + Api-platform(Symfony2)上传文件的最佳方式

时间:2015-12-29 08:41:57

标签: symfony file-upload restangular api-platform.com

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

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

所有字段(文件类型字段除外)都有效(保持OK)。现在,对于文件类型字段,我该怎么办?

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

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

在每种情况下,它需要发送到服务器的内容? Api-platform如何管理它?

如果你处于相同的情况,我希望你的意见。

非常感谢!

1 个答案:

答案 0 :(得分:3)

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

基本上,这个想法是:

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

    要从所选文件中获取data: URI客户端,您可以依赖readAsDataURL JavaScript API的FileReaderhttps://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL。 像往常一样使用Restangular发送结果字符串。

    服务器侧

    API平台规范化系统建立在Symfony Serializer之上。我在Symfony中提供了data: URI规范化程序和非规范化程序:https://github.com/symfony/symfony/pull/16164 它尚未合并,但您可以在此期间将其复制到您自己的项目中。

    注册规范化器:

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

    然后创建(并注册)一个新的规范化程序,用于装饰API平台的ItemNormalizer,使用{{将包含编码为data: URI的文件的属性转换为标准\SplFileObject 1}}方法。

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