首先,由于英语不是我的母语,请原谅我的错误。
我试图通过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
先谢谢你的帮助!
答案 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
构造函数的参数:
0
表示根本没有错误)UploadedFile
将调用is_uploaded_file
函数,它将失败(文件是通过解码base64字符串而不是上传而创建的)引发未知错误。如果您了解并接受风险,将此参数设置为true
以避免风险。