我正在尝试保存从表单发送的图像的原件和副本。我使用两个变量,第一个变量存储原始变量,第二个变量用于存储副本。我尝试过克隆、复制并再次获取数据,但没有任何效果。
$album = new Album();
$form = $this->createForm(CreateAlbumType::class, $album);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $doctrine->getManager();
$albumName = $album->getAlbumName();
$coverFile = $form->get('cover')->getData();
$coverFilePreview = clone $coverFile;
上面是处理表单数据的控制器的启动部分
$currentYear = date('Y');
$currentMonth = date('m');
$currentMonthPreview = $currentMonth . '_preview';
$uploadDirectoryMonth = 'images/' . $currentYear . '/' . $currentMonth;
$uploadDirectoryPreview = 'images/' . $currentYear . '/' . $currentMonthPreview;
if (!is_dir($uploadDirectoryMonth)) {
mkdir($uploadDirectoryMonth, 0755, true);
}
if (!is_dir($uploadDirectoryPreview)) {
mkdir($uploadDirectoryPreview, 0755, true);
}
$newFilename = $imageNumber . '.' . $coverFile->guessExtension();
$newFilenamePreview = $imageNumber . '_preview.' . $coverFilePreview->guessExtension();
$coverFile->move($uploadDirectoryMonth, $newFilename);
$coverFilePreview->move($uploadDirectoryPreview, $newFilenamePreview);
$album->setAlbumName($albumName);
$album->setCoverPath($uploadDirectoryMonth . '/' . $newFilename);
$album->setCoverPathPreview($uploadDirectoryPreview . '/' . $newFilenamePreview);
$entityManager->persist($album);
$entityManager->flush();
上面这是控制器的结束部分,我剪掉了一些小部分代码,因为我认为问题出在代码的这些部分
我尝试过通过第二个变量复制原始变量,我尝试过克隆并再次获取数据。这些是对我来说唯一有意义的选择。这样做的目的是让 coverFilePreview 具有相同的图像,但独立并且能够修改它,例如更改大小或名称,将其保存在不同的目录中,而不影响原始图像
您不应直接克隆代表上传文件的
$coverFile
对象,而应使用相同的文件路径创建 UploadedFile
的新实例。
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $doctrine->getManager();
$albumName = $album->getAlbumName();
$coverFile = $form->get('cover')->getData();
// Remove: $coverFilePreview = clone $coverFile;
// Create a copy of the uploaded file
$coverFilePreview = new UploadedFile(
$coverFile->getPathname(),
$coverFile->getClientOriginalName(),
$coverFile->getClientMimeType(),
$coverFile->getSize(),
true, // replace
true // autoDelete
);
// Rest of your code...
}