【问题标题】:How to post an entity embedding collection of files using API Platform?如何使用 API 平台发布嵌入文件的实体集合?
【发布时间】:2021-05-05 23:27:17
【问题描述】:

我有一个嵌入媒体对象集合的项目实体

    class Project
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups("project:read")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"project:read", "project:write"})
     */
    private $title;

    /**
     * @ORM\OneToMany(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

/**
 * @ORM\Entity
 * @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"}
 *     }
 * )
 * @Vich\Uploadable
 * @ORM\HasLifecycleCallbacks()
 */
class MediaObject
{
    /**
     * @var int|null
     *
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @ORM\Id
     * @Groups({"read", "project:read", "media_object_read"})
     */
    protected $id;

    /**
     * @var string|null
     *
     * @ApiProperty(iri="http://schema.org/contentUrl")
     */
    public $contentUrl;

    /**
     * @var File|null
     *
     * @Assert\NotNull(groups={"media_object_create", "project:write"})
     * @Vich\UploadableField(mapping="media_object", fileNameProperty="filePath")
     */
    public $file;

    /**
     * @var string|null
     *
     * @ORM\Column(nullable=true)
     * @Groups({"read", "project:read", "media_object_read", "project:read"})
     */
    public $filePath;

    /**
     * @ORM\Column(type="datetime")
     * @Groups({"media_object_write", "project:write"})
     */
    private $createdAt;

    /**
     * @ORM\OneToOne(targetEntity=User::class)
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity=Project::class, inversedBy="mediaObjects")
     */
    private $project;

我的问题:有没有办法发布一个包含媒体对象集合的项目?

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

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

但它不起作用。

我有“属性的嵌套文档是不允许的。请改用 iris”。

【问题讨论】:

    标签: javascript php reactjs symfony api-platform.com


    【解决方案1】:

    嘿@helloguys 好吧,我在同一个配音上苦苦挣扎,请问 Api Platform 团队...看看这个对话,它可能对您有帮助...here...但基本上我不使用VichUploader\Bundle,我通常使用一个CustomUploader类来帮助我将文件上传到文件系统,在MediaObject中暴露两个字段(“filename”,“data”)filename代表文件系统内部文件的文件名,data是文件的 base64encode 表示(这种方法的缺点是文件比平时稍大,这对于小文件来说是可以的),然后您可以使用一些序列化组(如普通字段)公开这些字段。然后你可以做一些 DataPersister 然后填写字段并使用 CustomUploader 将文件移动到文件系统上的最终目的地并通过关系持久化对象,使用此解决方案你可以将普通 json 发送到 API 端点而不是 multipart/表单数据,它将完美运行!让我知道这是否对您有帮助或您需要更多详细信息!干杯... PD:在对话中有一个示例的代码,其中一个 Service 实体与 MediaObject 具有 OneToMany 关系!还有 CustomUploaderHelper 类

    【讨论】:

    • 感谢马龙的回答!我会检查对话并尽快给你我的fb
    猜你喜欢
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多