2

フォームからファイルをアップロードするためにこのバンドルを使用しています。これが私がやったことです。バンドルを使用している Twig テンプレートで

<form action="{{ path('guardar-natural') }}" method="POST" class="form-horizontal" role="form" id="registroNatural" {{ form_enctype(form) }}>
    {{ form_widget(form.documento_rif) }}
    <button type="submit" class="btn btn-primary" id="btnEnviarRegistro">{{ 'registration.submit'|trans }}</button>
</form>

フォーム クラス:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
            ->add('documento_rif', 'vich_file', array(
                'required'      => true,
                'mapping'       => 'recaudos',
                'allow_delete'  => true,
                'download_link' => true,
                'label' => false,
            ))
            ->add('usuario', new RegistrationForm());
}

フィールドが存在するエンティティで:

use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @Vich\Uploadable
 */
class Natural
{
    /**
     * @Vich\UploadableField(mapping="recaudos", fileNameProperty="documentoRIF")
     * @var File $imageFile
     */
    protected $imageFile;

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

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @var \DateTime $updatedAt
     */
    protected $updatedAt;

    /**
     * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
     */
    public function setImageFile(File $image = null)
    {
        $this->imageFile = $image;

        if ($image) {
            $this->updatedAt = new \DateTime('now');
        }
    }

    /**
     * @return File
     */
    public function getImageFile()
    {
        return $this->imageFile;
    }

    /**
     * @param string $documentoRIF
     */
    public function setDocumentoRIF($documentoRIF)
    {
        $this->documentoRIF = $documentoRIF;
    }

    /**
     * @return string
     */
    public function getDocumentoRIF()
    {
        return $this->documentoRIF;
    }
}

config.ymlファイルで:

vich_uploader:
    db_driver: orm # or mongodb or propel or phpcr
    storage:    vich_uploader.storage.file_system
    mappings:
        recaudos:
            uri_prefix:         /recaudos
            upload_destination: %kernel.root_dir%/../web/uploads/recaudos
            namer:              vich_uploader.namer_uniqid
            delete_on_update:   true
            delete_on_remove:   true

エラーが発生しないため、バンドルが有効になっています。ディレクトリには適切な権限があります (0755)。DB レベルで列にレコードが作成されると、ファイル名の代わりdocumento_rifにこの文字列を取得し/tmp/php1fbjiZます。コードの何が問題になっていますか?

もちろん、これに関するコードは他にもありますが、関連する部分だけをここに書きます。

4

2 に答える 2

5

imageFileフォーム タイプでは、ファイル名の列 ( ) ではなく、アップロード可能なフィールド ( ) を参照する必要がありますdocumento_rif

バグにリンクされていませんが、問題が発生します:uri_prefixマッピングで定義された が正しくありません/uploads/recaudos

残りは大丈夫なはずです。

于 2014-11-09T09:57:17.487 に答える
2

少し前に画像のアップロードフォームを作成しました。これが役立つ場合があります。

->add('image', 'file', array(
    'label' => 'Image'
))

この方法で送信ボタンを作成しました:

->add('submit', 'submit', array(
    'label' => 'Upload',
))

データベースへのアップロードを処理するには:

if ($slidersForm->isValid()) {
    $data = $slidersForm->getData();
    $fileName = $this->uploadFile($data['image']);

    $images->setImage($fileName);

    $em->persist($images);
    $em->flush();
}

ファイルをアップロードし、DB に保存されているファイル名を返す関数:

public function uploadFile(UploadedFile $uploadedFile) {
    $kernel = $this->get('kernel');
    $dir = $kernel->locateResource('@MamgrowMainBundle/Resources/public/images/');

    $fileName = $uploadedFile->getClientOriginalName();
    $uploadedFile->move($dir, $fileName); //this uploads file to directory $dir you defined

    return $fileName;
}

以上です!それが何らかの形であなたの問題に役立つことを願っています。

于 2014-11-08T22:01:00.963 に答える