VichUploaderBundle&裁剪 - 将base64传递给文件实例

时间:2015-07-18 22:51:48

标签: jquery symfony file-upload base64 vichuploaderbundle

首先,由于英语不是我的母语,请原谅我的错误。

我试图通过Symfony2开发我的第一个项目。但是我对文件上传感到困惑。所以我已经安装了VichUploaderBundle,它提供了我需要管理的内容:所有类型的上传媒体(主要是图片)。

为什么我需要上传图片? 我的项目中有用户,他们可以编辑他们的个人资料。所以,我有一个实体ProfilePicture,它应该管理上传,感谢VichUploaderBundle。使用提交按钮或使用ajax发送表单时,它可以正常工作。

但是,为了改善用户体验,我还添加了一个jQuery插件(Cropit)。 Cropit给出裁剪图片的base64。我使用ajax发送整个。

知道......我很挣扎。我一直在网上搜索,找到一个有想法开头的人,我已经阅读了所有的文档,试图找到另一种方法来做我想做的事。

这是我的实际测试"代码:

$base64 = $request->request->get('base64');
preg_match('/data:([^;]*);base64,(.*)/', $base64, $matches);
$data = base64_decode($matches[2]);
$ui = uniqid().'.png';
$file = 'images/profile_pictures/'. $ui;
file_put_contents($file, $data);

$picture = new File($file);

$profile->getPicture()->setImageFile($picture);

这允许我将裁剪的图片保存在想要的目录中。但是,这并不是我真正想要的。事实上,我只是试图找到一种方法将我的base64内容转换为$ profile-> getPicture() - > setImageFile()中的内容,如果我刚发送了一张图片的话。我很模糊,我很抱歉。这是我第一次创建上传系统。

我认为可能有办法避免发送base64。但是我们可以用这种数据做些什么呢?我们可以使用jQuery对其进行解码并转换我的表单只是为了发送表单,如果我只是选择我的图片并想要保存整个表单吗?

您如何在项目中进行管理?有没有比这个更好的其他捆绑?我一直在寻找,但没有成功。 SonataMediaBundle似乎对我的需求很大,我发现也没办法用它来保存我的裁剪图片。

我发现有人想在Gich of VichUploaderBundle上管理它。但是,在给出更好的答案之前,他的问题已经结束...... https://github.com/dustin10/VichUploaderBundle/issues/223

先谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

该问题已关闭,因为它不适合捆绑的范围。 VichUploaderBundle基本上通过表单将UploadedFile对象映射到实体,这就是全部。

您问题的关键字为“{{1}}和”表单“。

如果您必须将您的文件作为base64编码的字符串,原始字节,...发送,那么您必须将其转换为{{1}}才能使其与VichUploaderBundle一起使用。我想DataTransformer可以做到这一点。它可以解码base64编码的字符串并将其存储在临时文件中,该文件可用于build an UploadedFile object

答案 1 :(得分:1)

我想分享我目前的解决方案。

我需要上传用base64编码的图片。这些图像使用cropper.js lib生成并发布到特定端点。

我使用DataTransformerInterface来构建像K-Phoen建议的UploadedFile对象。

我想指出与规范使用捆绑包的一些区别。

使用TextType代替VichFileType(否则验证将失败)。 使用数据转换器解码图像并临时保存(感谢您提示K-Phoen)。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('file', TextType::class, ['required' => true]);
    $builder->get('file')->addModelTransformer(new FileToBase64Transformer());
}

我的FileToBase64Trasformer

class FileToBase64Transformer implements DataTransformerInterface
{
    public function transform($value)
    {
    }

    public function reverseTransform($value)
    {
        $tmpFilePath = tempnam(sys_get_temp_dir(), 'allegato_');

        $tmp = fopen($tmpFilePath, 'wb+');

        $matches = [];
        preg_match('/^data:([\w-]+\/[\w-]+);base64,(.+)$/', $value, $matches);

        $size = fwrite($tmp, base64_decode($matches[2]));

        fclose($tmp);

        return new UploadedFile($tmpFilePath, 'originalName', $matches[1], $size, 0, true);
    }
}

注意UploadedFile构造函数的参数:

  1. 第3个参数是文件的mime类型
  2. 第4个参数是错误代码(0表示根本没有错误)
  3. 第五个参数完成了这个伎俩。内部UploadedFile将调用is_uploaded_file函数,它将失败(文件是通过解码base64字符串而不是上传而创建的)引发未知错误。如果您了解并接受风险,将此参数设置为true以避免风险