【问题标题】:Best way to upload files with Restangular + Api-platform (Symfony2)使用 Restangular + Api-platform (Symfony2) 上传文件的最佳方式
【发布时间】:2015-12-29 08:41:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    基本上,这个想法是:

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

    客户端

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

    服务器端

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

    注册规范器:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多