Comment ajouter un téléchargement de fichier à un DataFixture Symfony2?

Je n'arrive pas à comprendre comment j'ajouterais un téléchargement de fichier dans un DataFixture. J'essaie de télécharger une image pour le contenu factice que mes appareils chargent. Cela semble comme quelque chose qui serait utile de savoir.

12
demandé sur Elnur Abdurrakhimov 2012-09-07 02:03:56

4 réponses

bien que cette question ait été posée il y a un an, il semble qu'il n'y ait pas beaucoup d'information sur la façon de télécharger un fichier par le biais de la doctrine data fixture. Je n'ai pu trouver ce post.

j'ai regardé et j'ai pris une approche légèrement différente que ornj'S. (Peut-être à cause des mises à jour de Symfony.)

j'ai d'abord dû

use Symfony\Component\HttpFoundation\File\UploadedFile;

puis copie utilisée() pour copier l'image, parce que ornj dit qu'il va déplacer il.

copy($art1->getFixturesPath() . '01.jpg', $art1->getFixturesPath() . '01-copy.jpg');

puis créer et ajouter le fichier en utilisant:

$file = new UploadedFile($art1->getFixturesPath() . '01-copy.jpg', 'Image1', null, null, null, true);

$art1->setFile($file);

$manager->persist($art1);

si je n'ai pas paramétré le dernier paramètre à "true "dans le constructeur" UploadedFile "car il envoie une erreur inconnue lors de l'exécution de"doctrine:fixtures:load". Ce paramètre est "si le mode test est actif". Vu que c'est un montage, il est logique de le mettre en mode test.

la méthode " getFixturesPath ()" récupère simplement le chemin où sont mes images d'échantillon stocked:

// Entity file
public function getFixturesPath()
{
    return $this->getAbsolutePath() . 'web/uploads/art/fixtures/';
}

la méthode" getAbsolutePath () " a été prise de Téléchargement De Fichiers De Doctrine.

le code de travail complet: Entité:

<?php
//src/User/MyBundle/Entity/Art.php

namespace User/MyBundle/Entity;

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

/**
 * 
 * Art Entity
 * 
 * @ORM\Entity(repositoryClass="User\MyBundle\Entity\Repository\ArtRepository")
 * @ORM\Table(name="art")
 * @ORM\HasLifecycleCallbacks
 */
class Art
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $title;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $path;

    /**
     * @Assert\File(maxSize="6000000")
     */
    private $file;

    private $temp;

    public function getAbsolutePath()
    {
        return null === $this->path ? null : $this->getUploadRootDir() . '/' . $this->path;
    }

    public function getWebPath()
    {
        return null === $this->path ? null : $this->getUploadDir() . '/' . $this->path;
    }

    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded
        // documents should be saved
        return __DIR__ . '/../../../../web/' . $this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw up
        // when displaying uploaded doc/image in the view.
        return 'uploads/art';
    }

    public function getFixturesPath()
    {
        return $this->getAbsolutePath() . 'web/uploads/art/fixtures/';
    }

    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
        // check if we have an old image path
        if (isset($this->path)) {
            // store the old name to delete after the update
            $this->temp = $this->path;
            $this->path = null;
        } else {
            $this->path = 'initial';
        }
    }

    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->getFile()) {
            // do whatever you want to generate a unique filename
            $filename = sha1(uniqid(mt_rand(), true));
            $this->path = $filename . '.' . $this->getFile()->guessExtension();
        }
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        // the file property can be empty if the field is not required
        if (null === $this->getFile()) {
            return;
    }

        // if there is an error moving the file, an exception will
        // be automatically thrown by move(). This will properly prevent
        // the entity from being persisted to the database on error
        $this->getFile()->move($this->getUploadRootDir(), $this->path);

        // check if we have an old image
        if (isset($this->temp)) {
            // delete the old image
            unlink($this->getUploadRootDir() . '/' . $this->temp);
            // clear the temp image path
            $this->temp = null;
        }

        $this->file = null;
    }

    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if ($file = $this->getAbsolutePath()) {
            unlink($file);
        }
    }
}

Fixture:

<?php
// src/User/MyBundle/DataFixtures/ORM/ArtFixtures.php

namespace User\MyBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Fredzz\LotwBundle\Entity\Art;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class ArtFixtures extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $art1 = new Art();
        $art1->setTitle('MyTitle');
        $art1->setDescription('My description');

        copy($art1->getFixturesPath() . '01.jpg', $art1->getFixturesPath() . '01-copy.jpg');
        $file = new UploadedFile($art1->getFixturesPath() . '01-copy.jpg', 'Image1', null, null, null, true);
        $art1->setFile($file);

        $art1->setUser($manager->merge($this->getReference('user-1')));

        $manager->persist($art1);
        $manager->flush();
    }
}

J'espère que cela aidera quelqu'un! Désolé si quelque chose est faux. Je suis encore à apprendre :)

17
répondu Fred John 2015-10-22 05:33:27

j'ai trouvé la réponse à ma question. J'ai besoin d'utiliser la classe Symfony\Component\HttpFoundation\File\File pour créer un Fichier. Symfony va physiquement déplacer le fichier et ne pas créer une copie donc vous avez besoin d'avoir un nouveau fichier pour chaque fixture, utilisez utiliser copy() pour créer une copie du fichier qui peut être déplacé à la place.

$image = new Image();
$file = new File('path/to/file.jpg');
$image->file = $file;
$om->persist($image);

quelque Chose comme ça.

9
répondu ornj 2015-02-18 14:05:19

l'image que vous voulez utiliser doit être située dans votre dossier "Web" et vous devez utiliser seulement la chaîne de pointeur de fichier (i.e. "/web/images/test.png") dans votre data Fixture.

vous devriez généralement éviter de stocker des images dans votre base de données.

0
répondu Ken Hannel 2012-09-07 03:12:07

j'ai créé un FileUpload classe pour PHP 5.3+

comment utiliser?:

Documentation

from RFC 3023 (XML Media Types):

le type de média de haut niveau "text" a quelques restrictions sur les entités MIME et ils sont décrits dans [RFC2045] et [RFC2046]. En particulier, l' Les UTF-16 family, UCS-4, et UTF-32 ne sont pas autorisés (sauf les HTTP [RFC2616], qui utilise un MIME-like mécanisme.)

Autoriser uniquement les yaml fichier à télécharger:

<?php
$file = new FileUpload\FileUpload();
$file->setInput( "file" );
$FileUpload->setAllowedMimeTypes(array(
    "text/x-yaml", //RFC 3023
    "application/x-yaml", // Ruby on Rails
    "text/plain",//Possible option( only text plain )
    "text/yaml",//Possible option
    "text/x-yaml",//Possible option
    "application/yaml",//Possible option
));
$file->setDestinationDirectory("/var/www/html/myapp/");
$file->save();
if ($file->getStatus()) {
    echo "Okay";
}
?>

Exemple avec tous les types mime:

<?php
$file = new FileUpload\FileUpload();
$file->setInput( "file" );
$file->save();
if ($file->getStatus()) {
    echo "is Upload!";
}
?>
<html>
    <head>
        <title>FileUpload Example</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <form method="post" action="" enctype="multipart/form-data">
            <input type="file" name="file" />
            <input type="submit" value="Upload now!" />
        </form>
    </body>
</html>

GitHub: https://github.com/olaferlandsen/FileUpload-for-PHP

0
répondu Olaf Erlandsen 2014-02-19 16:44:38