2016-11-16 11 views
1

中に見つかりませんでした私はファイル属性を含む属性のリストを持つエンティティドキュメントを作成し、私は更新時にドキュメントを追加すると、非常によく合いながら、私は検証エラーを取得:symfonyの - ファイルが更新

ファイルが見つかりませんでした。

編集に追加することなく、オプションの間、私はちょうど古いファイルを保つことができるため、ファイル属性は、必要に応じなければなりません。ここで

は私の実体文書の一部です:

/** 
* @ORM\Entity 
* @ORM\Table(name="document") 
*/ 
class Document 
{ 
    ... 

    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @Assert\File(maxSize = "5M", mimeTypes = {"application/pdf"}) 
    * @ORM\Column(name="file", type="string", length=255, nullable=true) 
    */ 
    private $file; 

    /** 
    * @var string 
    * @ORM\Column(name="name", type="string", length=50) 
    */ 
    private $name; 

    /** 
    * @ORM\ManyToOne(targetEntity="Dtype", inversedBy="documents") 
    */ 
    private $dtype; 

... 

public function uploadFile($path, $type='', $oldFile=null) 
{ 
    $file = $this->getFile(); 
    if ($file instanceof UploadedFile) { 
     if(!empty($type)){ 
      $path = $path. '/' . $type; 
     } 
     $fileName = md5(uniqid()).'.'.$file->guessExtension(); 
     $file->move($path, $fileName); 
     $this->setFile($type. '/' .$fileName); 
     if($oldFile !== null){ 
      $oldFilePath = $path .'/'. $oldFile; 
      if(file_exists($oldFilePath)) 
       unlink($oldFilePath); 
     } 
    }else{ 
     $this->setFile($oldFile); 
    } 

} 

とコントローラで私が持っている:

public function editAction(Request $request, Document $document) { 
    $oldFile = $document->getFile(); 
    $form = $this->createForm('AppBundle\Form\DocumentType', $document); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $document->uploadFile($this->getParameter('documents_file_dir'), $document->getDtype()->getChemin(), $oldFile); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($document); 
     $em->flush(); 
    } 
... 
} 

任意のヘルプしてください?


EDIT

ドキュメントが更新されながら不思議行動IAM:

ユーザーがファイルを更新した場合、ファイルの属性は@assert \ファイルを検証する必要があります、

その他その他のファイル属性は検証されませんドキュメントの作成中に追加されました。

答えて

2

validation groupsを使用してください。

/** 
* ... 
* @Assert\File(maxSize = "5M", mimeTypes = {"application/pdf"}, groups = {"create"}) 
* ... 
*/ 
private $file; 

そして作成のために、関連するグループを指定し、アクションを編集します:唯一の新しい文書を作成するために必要なファイルとして マークフィールド

public function editAction(Request $request) { 
    // ... 
    $form = $this->createForm('AppBundle\Form\DocumentType', $document, ["create"]); 

// ... 

public function editAction(Request $request, Document $document) { 
    // ... 
    $form = $this->createForm('AppBundle\Form\DocumentType', $document, ["edit"]); 
+0

ご回答いただきありがとうございます。上記の検証グループを使用した場合はもちろん、フィールドを更新することができますが、ユーザーがファイルを更新した場合はファイルとして検証されません。 –

+0

ええと、ファイル名を保持し、同じ場所($ fileプロパティ)にファイルインスタンスをアップロードしました。したがって、ドキュメントの編集中に、handleRequest()メソッドは古いファイル名をformの値で置き換えます。空の値でエラーが発生してはいけません(バリデータはこの制約をスキップします)。しかし、エラーメッセージには、値が空ではないことが示されています。無効なファイル名(FileValidatorもファイル名として文字列を処理します)によって発生する同じエラーです。 edit(handleRequest()呼び出しの前とisValid()呼び出しの前)の間に、$ fileプロパティの境界値をチェックしてください。 – Timurib

+0

Symfonyで送信されたフォームは編集できないため、常に無効です。あなたの場合は、常にファイルストリングとアップロードされたファイルインスタンスの2つの別々の属性を作成します。 –

0

@Timuribの答えが正しい方向が、コードに私を得ましたまさに私のために働いた何symfonyの3.2.6 のために私のために動作しませんでした:

上記の解答とdと同じだった
/** 
* ... 
* @Assert\File(maxSize = "5M", mimeTypes = {"application/pdf"}, groups = {"create"}) 
* ... 
*/ 
private $file; 

私は同じ問題を抱えていた

public function editAction(Request $request) { 
    // ... 
    $form = $this->createForm('AppBundle\Form\DocumentType', $document, ["validation_groups" => "create"]); 

// ... 

public function editAction(Request $request, Document $document) { 
    // ... 
    $form = $this->createForm('AppBundle\Form\DocumentType', $document, ["validation_groups" => "edit"]); 
3

が、マニュアルに、答えがある:ifferent部分はCreateFormのでグループを指定された https://symfony.com/doc/current/controller/upload_file.html

すでに永続化アイテムを編集するためのフォームを作成しますファイルフォームタイプはFileインスタンスを引き続き予期します。ちょうどあなたのCreateFormの

を前に

use Symfony\Component\HttpFoundation\File\File; 
// ... 

$product->setBrochure(
    new File(_YOUR_UPLOAD_DIRECTORY_.'/'.$product->getBrochure()) 
); 

はそれを追加します:永続エンティティは、今だけの相対ファイルパスが含まれているとして、あなたは最初に保存されたファイル名で構成されたアップロードパスを連結して、新しいFileクラスを作成する必要があります

$document->setFile(
    new File(_YOUR_UPLOAD_DIRECTORY_.'/'.$document->getFile()) 
); 
$form = $this->createForm('AppBundle\Form\DocumentType', $document); 

あなたの問題を解決したいと考えています。

+0

共有してくれてありがとう、私は別の属性$ fileTmp(マップされていない)を追加することで問題を解決しました。Symfonyでファイルをアップロードするのが一般的な方法です。まあ、あなたのアプローチも良い解決策です。 –

関連する問題