Zend Framework - Tải lên tệp

Tải lên tệp là một trong những khái niệm chính trong lập trình biểu mẫu. Zend framework cung cấp tất cả các mục cần thiết để tải tệp lên thông quazend-formzend-inputfilter thành phần.

Lớp FileInput

Thành phần zend-inputfilter cung cấp lớp Zend \ InputFilter \ FileInput để xử lý phần tử đầu vào tệp html - <input type = 'file' />. CácFileInputgiống như các bộ lọc đầu vào khác với một vài ngoại lệ. Chúng như sau:

  • Vì PHP lưu chi tiết tệp được tải lên trong $_FILES mảng toàn cầu, FileInput chỉ thu thập thông tin tệp đã tải lên thông qua $ _FILES.

  • Việc xác thực cần được thực hiện trước khi lớp FileInput xử lý dữ liệu. Đây là hành vi ngược lại với các bộ lọc đầu vào khác.

  • Zend \ Validator \ File \ UploadFile là trình xác thực mặc định được sử dụng. CácUploadFile xác thực chi tiết đầu vào của tệp.

Để thêm loại tải lên tệp trong biểu mẫu, chúng tôi cần sử dụng loại đầu vào File. Mã một phần như sau:

$form->add(array( 
   'name' => 'imagepath', 
   'type' => 'File', 
   'options' => array('label' => 'Picture',), 
));

Một lớp khác được sử dụng để tải lên tệp là Zend \ Filter \ File \ RenameUpload. CácRenameUploadđược sử dụng để di chuyển tệp đã tải lên đến vị trí mong muốn của chúng tôi. Lớp một phần để sử dụng bộ lọc tệp như sau:

$file = new FileInput('imagepath'); 
$file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach( 
   new RenameUpload([ 
      'target'    => './public/tmpuploads/file', 
      'randomize' => true, 
      'use_upload_extension' => true 
   ]));
$inputFilter->add($file);

Tại đây, các tùy chọn của RenameUpload như sau -

  • target - Đường dẫn đích của tệp được tải lên.

  • randomize - Thêm một chuỗi ngẫu nhiên để tránh trùng lặp tệp đã tải lên.

  • use_upload_extension - Nối phần mở rộng tệp vào tệp đã tải lên đến đích.

Tải lên tệp - Ví dụ làm việc

Hãy để chúng tôi sửa đổi mô-đun hướng dẫn và bao gồm tính năng tải ảnh lên.

Sửa đổi bảng cơ sở dữ liệu

Hãy để chúng tôi thêm imagepath cột vào bảng sách bằng cách thực hiện lệnh SQL sau:

ALTER TABLE `book` ADD `imagepath` VARCHAR(255) NOT NULL AFTER 'imagepath';

Cập nhật BookForm.php

Thêm phần tử đầu vào tệp để tải ảnh lên ở dạng sách - myapp / module / Tutorial / src / Model / BookForm.php.

Bao gồm mã sau trong __constructmethod của lớp BookForm.

$this->add(array( 
   'name' => 'imagepath', 
   'type' => 'File', 
   'options' => array ('label' => 'Picture',), 
));

Cập nhật Book.php

Thực hiện các thay đổi sau trong lớp Sách - myapp / module / Tutorial / src / Model / Book.php.

  • Thêm một thuộc tính mới imagepath cho bức tranh.

public $imagepath;
  • Cập nhật getInputFilter như hình dưới đây -

    • Thêm FileInput bộ lọc cho phần tử đầu vào tệp.

    • Đặt UploadFile xác thực để xác thực phần tử đầu vào tệp.

    • Định cấu hình RenameUpload để di chuyển tệp đã tải lên đến đích thích hợp.

Danh sách một phần mã như sau:

$file = new FileInput('imagepath'); $file->getValidatorChain()->attach(new UploadFile()); 
$file->getFilterChain()->attach( new RenameUpload([ 'target' => './public/tmpuploads/file', 'randomize' => true, 'use_upload_extension' => true ])); $inputFilter->add($file);
  • Cập nhật exchangeArray phương pháp bao gồm imagepathbất động sản. Đường dẫn hình ảnh có thể đến từ một biểu mẫu hoặc một cơ sở dữ liệu. Nếu đường dẫn hình ảnh đến từ một biểu mẫu, định dạng sẽ là một mảng với đặc điểm kỹ thuật sau:

array(1) { 
   ["imagepath"] => array(5) { 
      ["name"]     => string "myimage.png" 
      ["type"]     => string "image/png"           
      ["tmp_name"] => string 
         "public/tmpuploads/file_<random_string>.<image_ext>" 
      ["error"]    => int <error_number> 
      ["size"]     => int <size> 
   } 
}
  • Nếu đường dẫn hình ảnh đến từ cơ sở dữ liệu, nó sẽ là một chuỗi đơn giản. Danh sách mã một phần để phân tích cú pháp một đường dẫn hình ảnh như sau:

if(!empty($data['imagepath'])) { 
   if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "", $data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null; 
}

Danh sách đầy đủ của Book mô hình như sau -

<?php  
namespace Tutorial\Model;  
use Zend\InputFilter\InputFilterInterface; 
use Zend\InputFilter\InputFilterAwareInterface;  
use Zend\Filter\File\RenameUpload; 
use Zend\Validator\File\UploadFile; 
use Zend\InputFilter\FileInput; 
use Zend\InputFilter\InputFilter;  

class Book implements InputFilterAwareInterface { 
   public $id; public $author; 
   public $title; public $imagepath;  
   protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) { 
      throw new \Exception("Not used");
   }  
   public function getInputFilter() { 
      if (!$this->inputFilter) { $inputFilter = new InputFilter(); 
         $inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array( 
            'name' => 'author', 
            'required' => true, 
            'filters' => array( 
               array('name' => 'StripTags'), 
               array('name' => 'StringTrim'), 
            ), 
            'validators' => array( 
               array( 
                  'name' => 'StringLength', 
                  'options' => array( 
                     'encoding' => 'UTF-8', 
                     'min' => 1, 
                     'max' => 100, 
                  ), 
               ), 
            ), 
         )); 
         $inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $file = new FileInput('imagepath'); 
         $file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach( 
            new RenameUpload([ 
               'target'    => './public/tmpuploads/file', 
               'randomize' => true, 
               'use_upload_extension' => true 
            ])); 
            $inputFilter->add($file);  
            $this->inputFilter = $inputFilter; 
      } 
      return $this->inputFilter; } public function exchangeArray($data) { 
      $this->id = (!empty($data['id'])) ? $data['id'] : null; $this->author = (!empty($data['author'])) ? $data['author'] : null; 
      $this->title = (!empty($data['title'])) ? $data['title'] : null; if(!empty($data['imagepath'])) { 
         if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "", 
               $data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null; 
      } 
   } 
}

Cập nhật BookTable.php

Chúng tôi đã cập nhật BookFormBook model. Bây giờ, chúng tôi cập nhậtBookTable và sửa đổi saveBookphương pháp. Điều này là đủ để bao gồm mục nhập đường dẫn hình ảnh trong mảng dữ liệu,$data.

Danh sách một phần mã như sau:

$data = array('author' => $book->author, 'title' => $book->title, 
   'imagepath' => $book->imagepath 
);

Danh sách mã hoàn chỉnh của BookTable lớp như sau -

<?php  
namespace Tutorial\Model;  
use Zend\Db\TableGateway\TableGatewayInterface;  

class BookTable {  
   protected $tableGateway; 
   public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; 
   }  
   public function getBook($id) { $id  = (int) $id; $rowset = $this->tableGateway->select(array('id' => $id)); 
      $row = $rowset->current(); 
      if (!$row) { throw new \Exception("Could not find row $id"); 
      } 
      return $row; } public function saveBook(Book $book) { 
      $data = array ( 'author' => $book->author,
         'title'  => $book->title, 'imagepath' => $book->imagepath 
      );  
      $id = (int) $book->id; 
      if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id)); 
         } else { 
            throw new \Exception('Book id does not exist'); 
         } 
      } 
   } 
}

Update addAction in the TutorialController.php: Thông tin tải lên tệp sẽ có sẵn trong $_FILES mảng toàn cầu và nó có thể được truy cập bằng cách sử dụng Request's getFiles()phương pháp. Vì vậy, hãy hợp nhất cả dữ liệu đã đăng và thông tin tải lên tệp như hình dưới đây.

$post = array_merge_recursive( 
   $request->getPost()->toArray(), $request->getFiles()->toArray() 
);

Danh sách đầy đủ của addAction() phương pháp như sau:

public function addAction() { 
   $form = new BookForm(); $form->get('submit')->setValue('Add');  
   $request = $this->getRequest(); 
   if ($request->isPost()) { $book = new Book(); 
      $form->setInputFilter($book->getInputFilter()); 
      $post = array_merge_recursive( $request->getPost()->toArray(), 
         $request->getFiles()->toArray() ); $form->setData($post); if ($form->isValid()) { 
         $book->exchangeArray($form->getData());  
         $this->bookTable->saveBook($book);  
         
         // Redirect to list of Tutorial 
         return $this->redirect()->toRoute('tutorial'); } } return array('form' => $form); 
}

Cập nhật Chế độ xem của add.phtml

Cuối cùng, thay đổi “add.phtml” và bao gồm phần tử đầu vào tệp imagepath như hình dưới đây -

echo $this->formRow($form->get('imagepath'))."<br>";

Danh sách đầy đủ như sau:

<?php 
$title = 'Add new Book'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php if(!empty($form)) {  
   $form->setAttribute('action', $this->url('tutorial', array('action' => 'add'))); 
   $form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('author'))."<br>"; echo $this->formRow($form->get('title'))."<br>"; echo $this->formRow($form->get('imagepath'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag(); 
}

Chạy ứng dụng

Cuối cùng, chạy ứng dụng tại http://localhost:8080/tutorial/add và thêm các bản ghi mới.

Kết quả sẽ được hiển thị trong ảnh chụp màn hình sau:

Form Page

Index Page