chi*_*ger 6 filesystems delete-file symfony
我有一个带有createActionaneditAction和 a的控制器deleteAction。
我可以添加图片并从数据库中删除它们。
当我按照 Symfony doc 创建上传文件时,我也在config.yml这条路线中创建了
parameters:
uploaded_restaurants: "%kernel.root_dir%/../web/uploads/restaurants"
Run Code Online (Sandbox Code Playgroud)
所以这是我上传文件的路线。
我的问题
当我用我的删除操作删除我的照片时,它会在我的数据库中删除它。但不是在我的文件夹中,/web/uploads/restaurants
我试图找到一种方法也可以在我的文件夹中删除它们,但无法成功。
我也试过用 aFilesystem()删除它们,但我一定写得很糟糕。
这是我的控制器:
class MediaController extends Controller
{
/**
* @param Request $request
* @param Restaurant $restaurant
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function newAction(Request $request, Restaurant $restaurant)
{
$media = new Media();
$form = $this->createForm(MediaType\CreateType::class, $media);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$mediaList = $this->getDoctrine()->getRepository('AppBundle:Media')->findImageByRestaurantType($restaurant, $form->get('context')->getData());
if ($mediaList == null || count($mediaList) < 1) {
$media->setType('img')
->setContext($form->get('context')->getData())
;
} else {
$media = $mediaList;
}
$imageFile = $request->files->get('create')['name'];
$targetDir = $this->getParameter('uploaded_restaurants');
$imageName = $this->get('app.uploader')->upload($imageFile, $targetDir);
/** @var $originalName */
$originalName = $imageFile->getClientOriginalName();
$media->setName($imageName)
->setOriginalName($originalName)
->setCreatedAt(new \DateTime());
$em = $this->getDoctrine()->getManager();
$media->setRestaurant($restaurant);
$em->persist($media);
$em->flush();
return $this->redirectToRoute('admin_restaurant_show_fr', array('id' => $restaurant->getId()));
}
return $this->render('admin/restaurant/media/new.html.twig', array(
'restaurant' => $restaurant,
'form' => $form->createView()
));
}
/**
* @param Request $request
* @param Media $media
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function editAction(Request $request, Media $media)
{
$em = $this->getDoctrine()->getManager();
$editForm = $this->createForm(MediaType\EditType::class, $media);
$editForm->handleRequest($request);
$restaurant = $media->getRestaurant();
if ($editForm->isSubmitted() && $editForm->isValid()) {
$imageFile = $request->files->get('edit')['name'];
$targetDir = $this->getParameter('uploaded_restaurants');
$imageName = $this->get('app.uploader')->upload($imageFile, $targetDir);
if ($request->files->get('edit')['name'] != null) {
$fs = new Filesystem();
try {
$fs->remove($this->get('kernel')->getRootDir() . '/../web/uploads/restaurants' . $media->getName());
} catch (IOException $e) {
echo "error";
}
/** @var $originalName */
$originalName = $imageFile->getClientOriginalName();
$media->setName($imageName)
->setOriginalName($originalName)
->setUpdatedAt(new \DateTime());
}
$em->persist($media);
$em->flush();
return $this->redirectToRoute('admin_restaurant_show_fr', array('id' => $restaurant->getId()));
}
return $this->render('admin/restaurant/media/edit.html.twig', array(
'media' => $media,
'restaurant' => $restaurant,
'editForm' => $editForm->createView()
));
}
/**
* @param Media $media
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function deleteAction(Media $media)
{
$restaurant = $media->getRestaurant();
$em = $this->getDoctrine()->getManager();
$em->remove($media);
$em->flush();
return $this->redirectToRoute('admin_restaurant_show_fr', array('id' => $restaurant->getId()));
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在 editAction 中看到的,我尝试添加一个Filesystem以删除文件
我的问题
我怎样才能做到这一点对我editAction和我的deleteAction,以从目录中删除正确我的文件?如果您不太了解我的代码,是否有可以向我展示有效的示例?谢谢
dbr*_*ann 13
在编辑或删除媒体时,您都有可用的文件名的现有对象,例如:
public function deleteAction(Media $media){ ... }
Run Code Online (Sandbox Code Playgroud)
Doctrine 将从 url 中读取 id 并从数据库中加载相应的媒体。您可以使用此对象获取旧图像位置,然后删除该图像。
// getName() will contain the complete filename with path.
// Check your showAction where you call `setName($imageName)`
$filename = $media->getName();
$filesystem = new Filesystem();
$filesystem->remove($filename);
Run Code Online (Sandbox Code Playgroud)
您可以在您的 editAction 中执行相同的操作,而不是您提供的代码。