it-swarm.com.de

Laden Sie das Bild in Symfony 4 hoch

Ich versuche, mithilfe dieses Lernprogramms eine Datei in mein Symfony-Projekt hochzuladen: http://symfony.com/doc/current/controller/upload_file.html

Symfony zeigt keinen Fehler an, aber wenn ich die Datei hochlade, passiert nichts und in meiner Datenbank habe ich anstelle des filename.jpg diese Zeile C:\wamp64\tmp\php9294.tmp

Hier ist meine Entität:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;

/**
* @ORM\Entity(repositoryClass="App\Repository\ItemRepository")
*/
class Item
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

 * @ORM\Column(type="string")
 * @Assert\NotBlank(message="Upload your image")
 * @Assert\File(mimeTypes={ "image/png", "image/jpeg" })
 */
private $image;

public function getImage()
{
    return $this->image;
}

public function setImage($image)
{
    $this->image = $image;

    return $this;
}

Mein Formular:

namespace App\Form;

use App\Entity\Item;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;


class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('image',FileType::class,array('data_class'=> null, 'label' => 'Image'))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Item::class,
        ));
    }
}

Mein Controller:

namespace App\Controller;

use App\Entity\Item;
use App\Form\ItemType;
use App\Repository\ItemRepository;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/item")
 */
class ItemController extends Controller
{
    /**
     * @Route("/", name="item_index", methods="GET")
     */

    /**
     * @Route("/new", name="item_new", methods="GET|POST")
     */
    public function new(Request $request): Response
    {
        $item = new Item();
        $form = $this->createForm(ItemType::class, $item);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $file = $item->getImage();

            $fileName = $this->generateUniqueFileName().'.'.$file->guessExtension();

            // moves the file to the directory where brochures are stored
            $file->move(
                $this->getParameter('brochures_directory'),
                $fileName
            );

            $item->setImage($fileName);



            return $this->redirectToRoute('item_index');
        }

        return $this->render('item/new.html.twig', [
            'item' => $item,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @return string
     */
    private function generateUniqueFileName()
    {
        // md5() reduces the similarity of the file names generated by
        // uniqid(), which is based on timestamps
        return md5(uniqid());
    }
}

Ich habe genau die im Tutorial genannten Schritte befolgt, aber das Bild scheint nicht in meinen Ordner hochgeladen worden zu sein

2
nicoolaslb

Ich empfehle Ihnen, das StofDoctrineExtensionsBundle zu verwenden: https://symfony.com/doc/master/bundles/StofDoctrineExtensionsBundle/index.html

Die für Sie hochladbaren Erweiterungen helfen Ihnen beim Hochladen von Dateien mit einigen Diensten.

Fordern Sie es zunächst an: composer require stof/doctrine-extensions-bundle
Konfigurieren Sie es nun in der Datei config/packages/stof_doctrine_extensions.yml so (unter Berücksichtigung des Ordners public/uploads mit Lese-/Schreibberechtigung):

stof_doctrine_extensions:
    default_locale: en_US
    uploadable:
        default_file_path: "%kernel.root_dir%/../public/uploads"
        mime_type_guesser_class: Stof\DoctrineExtensionsBundle\Uploadable\MimeTypeGuesserAdapter
        default_file_info_class: Stof\DoctrineExtensionsBundle\Uploadable\UploadedFileInfo
    orm:
        default:
            uploadable: true

Erstellen Sie jetzt den Entity/File.php, um ihn zu verwenden:

<?php

namespace App\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
use Overblog\GraphQLBundle\Annotation\GraphQLColumn;

/**
 * @ORM\Entity
 * @Gedmo\Uploadable(filenameGenerator="SHA1", allowOverwrite=true, appendNumber=true)
 */
class File
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @ORM\Column(name="path", type="string")
     * @Gedmo\UploadableFilePath
     */
    protected $path;

    /**
     * @ORM\Column(name="name", type="string")
     * @Gedmo\UploadableFileName
     */
    protected $name;

    /**
     * @ORM\Column(name="mime_type", type="string")
     * @Gedmo\UploadableFileMimeType
     */
    protected $mimeType;

    /**
     * @ORM\Column(name="size", type="decimal")
     * @Gedmo\UploadableFileSize
     */
    protected $size;

    /**
     * @GraphQLColumn(type="String")
     */
    protected $publicPath;

    /**
     * @return string
     */
    public function getPublicPath()
    {
        return '/uploads/'.$this->name;
    }

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return mixed
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * @param mixed $path
     *
     * @return File
     */
    public function setPath($path)
    {
        $this->path = $path;

        return $this;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     *
     * @return File
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return mixed
     */
    public function getMimeType()
    {
        return $this->mimeType;
    }

    /**
     * @param mixed $mimeType
     *
     * @return File
     */
    public function setMimeType($mimeType)
    {
        $this->mimeType = $mimeType;

        return $this;
    }

    /**
     * @return mixed
     */
    public function getSize()
    {
        return $this->size;
    }

    /**
     * @param mixed $size
     *
     * @return File
     */
    public function setSize($size)
    {
        $this->size = $size;

        return $this;
    }
}

Im letzten Schritt erstellen Sie eine Beziehung zur Entität File. Danach können Sie den Upload mit dem UploadManager wie folgt konkretisieren:

<?php

public function uploadFile(\Stof\DoctrineExtensionsBundle\Uploadable\UploadableManager $uploadableManager)
{
    $uploadableManager->markEntityToUpload($file, $fileInfo);
}

Und einfach durchhalten/spülen.

0
Coco Jr

Ich hatte das gleiche Problem und fand heraus, dass es eine Frage der Berechtigungen war. Wenn jemand anderes im Teil stecken blieb, geben Sie dem Ordner alle Berechtigungen und versuchen Sie es erneut.

Hoffe es könnte hilfreich sein.

0
krachleur