【发布时间】:2019-08-03 01:47:39
【问题描述】:
在 symfony 中,我有一个实体Program,它的属性为image。通过VichUploaderBundle 上传图像、命名它们并将它们放在正确的目录中。实体如下所示:
//...
/**
* NOTE: This is not a mapped field of entity metadata, just a simple property.
*
* @Assert\Image(
* maxSize="5M",
* mimeTypesMessage="The file you tried to upload is not a recognized image file"
* )
* @Vich\UploadableField(mapping="program_image", fileNameProperty="imageName")
*
* @var File
*/
private $image;
/**
* @ORM\Column(type="string", length=191, nullable=true)
*/
private $imageName;
//...
现在我希望在上传图像之前对其进行处理,我已经使用一些返回 base64 字符串的 JS 来完成。我将此字符串放在隐藏的输入字段base64Image 中。然后我在我的控制器中检索此字符串并尝试将其制作成可以保存到我的实体的图像,如下所示:
if ($form->isSubmitted() && $form->isValid()) {
$program = $form->getData();
$base64String = $request->request->get('base64Image');
$decodedImageString = base64_decode($base64String);
$program->setImage($decodedImageString);
//etc.....
程序出现在最后一行。 $decodedImageString 实际上是另一个首先需要创建到文件中的字符串。我查看了file_put_contents 以创建一个文件作为描述者here,但没有运气。
文件名不能为空
是我收到的错误。另外我不知道这是否适用于VichUploaderBundle,也许该问题的答案也已过时。关于我能做什么的任何建议?
编辑: 使用以下代码进行转换和上传:
define('UPLOAD_DIR', 'images/');
$img = $request->request->get('base64Image');
$img = str_replace('data:image/jpeg;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.jpeg';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';
现在我只需要以某种方式加载 VichUploaderBundle 配置,或者可能不完全使用它。
【问题讨论】:
-
我在此主题converting-any-base64-file-to-a-file-and-moving-to-the-targeted-path-in-php-symfony 中发布了答案。我希望这可以让您了解如何使用 vichuploaderbundle 进行管理。
-
然后你也可以通过这个话题convert-base64-string-to-an-image-file得到这个答案。这可以帮助您提取 pur base64 图像,并结合我上面的答案使用 vichuploaderbundle 进行管理。
-
@williambridge,我尝试了你写下的一切。当我尝试使用
$program->saveImage()保存图像时,我仍然遇到问题。使用tempnam()创建的临时文件不会被识别为文件,而是被识别为字符串。我尝试将扩展名更改为 .jpeg,但这也不起作用。
标签: symfony symfony4 vichuploaderbundle