如何使用API平台发布实体嵌入文件集合?



我有一个嵌入mediaObjects集合的Project实体

class Project
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
* @Groups("project:read")
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
* @Groups({"project:read", "project:write"})
*/
private $title;
/**
* @ORMOneToMany(targetEntity=MediaObject::class, mappedBy="project", cascade={"persist"})
* @Groups({"project:read", "project:write"})
*/
private $mediaObjects;

我的MediaOjbect类看起来像API平台文档中描述的使用VichUploaderBundle (https://api-platform.com/docs/core/file-upload/)处理文件上传,除了我有项目id也

/**
* @ORMEntity
* @ApiResource(
*     iri="http://schema.org/MediaObject",
*     normalizationContext={
*         "groups"={"media_object_read"}
*     },
*     denormalizationContext={
*         "groups"={"media_object_create"}
*     },
*     collectionOperations={
*         "post"={
*             "controller"=CreateMediaObjectAction::class,
*             "deserialize"=false,
*             "security"="is_granted('ROLE_USER')",
*             "validation_groups"={"Default", "media_object_create", "project:write"},
*             "openapi_context"={
*                 "requestBody"={
*                     "content"={
*                         "multipart/form-data"={
*                             "schema"={
*                                 "type"="object",
*                                 "properties"={
*                                     "file"={
*                                         "type"="string",
*                                         "format"="binary"
*                                     }
*                                 }
*                             }
*                         }
*                     }
*                 }
*             }
*         },
*         "get"
*     },
*     itemOperations={
*         "get",
*         "put"={"security"="object.getUser() == user"},
*         "patch",
*         "delete"={"security"="object.getUser() == user"}
*     }
* )
* @VichUploadable
* @ORMHasLifecycleCallbacks()
*/
class MediaObject
{
/**
* @var int|null
*
* @ORMColumn(type="integer")
* @ORMGeneratedValue
* @ORMId
* @Groups({"read", "project:read", "media_object_read"})
*/
protected $id;
/**
* @var string|null
*
* @ApiProperty(iri="http://schema.org/contentUrl")
*/
public $contentUrl;
/**
* @var File|null
*
* @AssertNotNull(groups={"media_object_create", "project:write"})
* @VichUploadableField(mapping="media_object", fileNameProperty="filePath")
*/
public $file;
/**
* @var string|null
*
* @ORMColumn(nullable=true)
* @Groups({"read", "project:read", "media_object_read", "project:read"})
*/
public $filePath;
/**
* @ORMColumn(type="datetime")
* @Groups({"media_object_write", "project:write"})
*/
private $createdAt;
/**
* @ORMOneToOne(targetEntity=User::class)
*/
private $user;
/**
* @ORMManyToOne(targetEntity=Project::class, inversedBy="mediaObjects")
*/
private $project;

我的问题:有没有办法张贴一个项目与mediaObjects的集合在它?

我正在使用React.js客户端。我试图发布一个数组的formData,这种类型的请求有效载荷:

{
title: "title",
mediaObjects: [
formData,
formData
]
}

但是行不通。

我有"嵌套文档的属性是不允许的。

嘿@helloguys好吧,我是挣扎于相同的配音和问Api平台团队…看看这段对话,它可能对你有帮助。但基本上我不使用VichUploader 包,我通常使用一个CustomUploader类,帮我上传文件到文件系统,使两个字段在MediaObject("filename","data"文件名代表文件系统内的文件的文件名和数据的base64encode表示文件(这种方法的缺点是,这种方式的文件比平时略大,这是好的对于小文件),然后,您可以使用一些序列化组(如普通字段)公开这些字段。然后,您可以做一些DataPersister,然后填写字段,并使用CustomUploader将文件移动到文件系统上的最终目的地,并通过关系持久化对象,使用此解决方案,您可以将普通json发送到API端点,而不是multipart/form-data,它将完美地工作!如果这对你有帮助,或者你需要更多的细节,请告诉我!欢呼声……PD:在对话中有一个示例代码,其中一个服务实体与MediaObject具有OneToMany关系!以及CustomUploaderHelper类

相关内容

  • 没有找到相关文章

最新更新