2012-08-23 37 views
7

Trong Symfony tôi có thể chấp nhận các loại MIME sử dụng:Tải tệp lên: Cách loại trừ loại MIME bằng cách sử dụng xác nhận?

/** 
    * @Assert\File(maxSize="10M", mimeTypes={"application/pdf", "image/png"}) 
    */ 
public $file; 

Nhưng làm thế nào tôi có thể loại trừ một cái gì đó từ danh sách đó? Giả sử, tôi muốn cho phép tất cả các video tải lên ngoại trừ tệp PHP?

+1

Tôi sợ rằng bạn cần phải tạo ra ràng buộc của riêng bạn ... – Florent

+0

Hm, đó là những gì tôi đã tìm. Rất cám ơn vì đã dọn dẹp. – insertusernamehere

+3

Bạn nên ** luôn luôn ** danh sách trắng thay vì danh sách đen, chỉ cần liệt kê các mimeTypes mà bạn cho phép thay vì không cho phép – JamesHalsall

Trả lời

4

Bạn có thể triển khai Callback constraint qua xác nhận. Một ưu điểm của phương pháp này là bạn có thể áp dụng thông báo lỗi cho bất kỳ trường nào (hoặc các trường) trong biểu mẫu của bạn.

use Symfony\Component\Validator\ExecutionContext; 

/** 
* @ORM\Entity() 
* @Assert\Callback(methods={"validateFile"}) 
*/ 
class MyEntity 
{ 

    public function validateFile(ExecutionContext $context) 
    { 
     $path = $context->getPropertyPath(); 
     if (/* $this->file is not in allowed mimeTypes ... */) { 
      $context->setPropertyPath($path . '.file'); 
      $context->addViolation("Invalid file mimetype", array(), null); 
     } 
    } 
} 
4

Bạn không cần phải tạo bất kỳ cuộc gọi lại nào để thực hiện việc này. Chỉ cần chắc chắn:

1) Set thông số enable_annotations như đúng trong ứng dụng của bạn/config/config.yml:

# app/config/config.yml 
framework: 
    validation:  { enable_annotations: true } 

2) Bao gồm đúng những hạn chế xác nhận trong hồ sơ tổ chức của bạn.

// YourEntity.php 
use Symfony\Component\Validator\Constraints as Assert; 

3) Sử dụng chú thích đúng cách. Ví dụ:

// YourEntity.php 
/** 
* @Assert\File(
*  maxSize="5242880", 
*  mimeTypes = { 
*   "image/png", 
*   "image/jpeg", 
*   "image/jpg", 
*   "image/gif", 
*   "application/pdf", 
*   "application/x-pdf" 
*  } 
*) 
*/ 
private $arquivo; 

Mã trên đây đang hoạt động tốt trên Symfony 2.3.9.

[] s

+1

Tôi nghĩ bạn hiểu sai câu hỏi. OP cần Chấp nhận * mọi * mimeTypes ** NHƯNG ** một số. – Touki

+0

Bạn đã đúng! Xin lỗi, tôi cũng đang trong một câu hỏi khác và trả lời sai. Lỗi của tôi! =) – brunoric

Các vấn đề liên quan