我第一次使用api-platform,我正在寻找上传文件的最佳方式。
我的情况: 服务器端具有OneToMany关系“Media”(SonataMedia)的实体“Post”,我正在创建视图(Angular + Restangular)。
所有字段(文件类型字段除外)都有效(保持OK)。现在,对于文件类型字段,我该怎么办?
异步上传?在这种情况下,如何将文件上传链接到我的实体(尚未保留)
在表单实体提交上传文件?
在每种情况下,它需要发送到服务器的内容? Api-platform如何管理它?
如果你处于相同的情况,我希望你的意见。
非常感谢!
答案 0 :(得分:3)
在API平台中编写时,没有内置文件上载支持。您需要编写自己的代码来处理上传。 但是,有些工作是在本地添加此功能的一些工作,您已经可以使用它了。
基本上,这个想法是:
data:
URI客户端(使用JavaScript)data:
URI服务器端解码为常规文件<强>客户端强>
要从所选文件中获取data:
URI客户端,您可以依赖readAsDataURL
JavaScript API的FileReader
:https://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)中,所有这些逻辑将自动可用并注册。