1

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

我正在尝试通过 Symfony2 开发我的第一个项目。但是我被文件上传卡住了。所以我安装了 VichUploaderBundle,它提供了我需要管理的内容:所有类型的上传媒体(主要是图像)。

为什么我需要上传图片? 我的项目中有用户,他们可以编辑他们的个人资料。所以,感谢 VichUploaderBundle,我有一个实体 ProfilePicture 应该管理上传。当使用提交按钮或使用 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 似乎对我的需要很大,我也找不到用它保存裁剪图片的方法。

我在 VichUploaderBundle 的 Git 上找到了想管理它的人。然而,在给出更好的答案之前,他的问题已经解决了...... https://github.com/dustin10/VichUploaderBundle/issues/223

提前感谢您的帮助!

4

2 回答 2

2

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

您的问题的关键字是“UploadedFile"和”形式。

如果您必须将文件作为 base64 编码的字符串、原始字节等发送,那么您必须将其转换为 anUploadedFile才能使其与 VichUploaderBundle 一起使用。我想DataTransformer可以做到这一点。它可以解码 base64 编码的字符串并将其存储在一个临时文件中,该文件可用于构建 UploadedFile 对象

于 2015-07-18T23:31:37.280 回答
1

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

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

我用 aDataTransformerInterface来构建一个UploadedFile像 K-Phoen 建议的对象。

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

使用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. 第三个参数是文件的mime类型
  2. 第 4 个参数是错误代码(0表示完全没有错误)
  3. 第 5 个参数可以解决问题。内部UploadedFile将调用is_uploaded_file函数,这将失败(文件是通过解码 base64 字符串创建的,未上传)引发未知错误。如果您理解并接受风险,请将此参数设置为true以规避风险。
于 2018-02-15T23:04:34.413 回答