Zend Framework - Hochladen von Dateien
Das Hochladen von Dateien ist eines der Hauptkonzepte in der Formularprogrammierung. Das Zend-Framework bietet alle erforderlichen Elemente zum Hochladen von Dateien über daszend-form und die zend-inputfilter Komponente.
FileInput-Klasse
Die zend-inputfilter-Komponente stellt die Klasse Zend \ InputFilter \ FileInput bereit, um das Eingabeelement für die HTML-Datei zu verarbeiten. <input type = 'file' />. DasFileInputist wie die anderen Eingangsfilter mit wenigen Ausnahmen. Sie sind wie folgt -
Da PHP die hochgeladenen Dateidetails in speichert $_FILES Im globalen Array sammelt der FileInput die hochgeladenen Dateiinformationen nur über $ _FILES.
Die Validierung muss durchgeführt werden, bevor die FileInput-Klasse die Daten verarbeitet. Es ist das entgegengesetzte Verhalten der anderen Eingangsfilter.
Der Zend \ Validator \ File \ UploadFile ist der zu verwendende Standardvalidator. DasUploadFile Überprüft die Dateieingabedetails.
Um einen Datei-Upload-Typ in ein Formular einzufügen, müssen Sie den Eingabetyp verwenden File. Der Teilcode lautet wie folgt:
$form->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array('label' => 'Picture',),
));
Eine andere Klasse, die beim Hochladen von Dateien verwendet wird, ist Zend \ Filter \ File \ RenameUpload. DasRenameUploadwird verwendet, um die hochgeladene Datei an den gewünschten Speicherort zu verschieben. Die Teilklasse zur Verwendung des Dateifilters lautet wie folgt:
$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);
Hier die Optionen von RenameUpload sind wie folgt -
target - Der Zielpfad der hochgeladenen Datei.
randomize - Fügen Sie eine zufällige Zeichenfolge hinzu, um ein Duplizieren der hochgeladenen Datei zu verhindern.
use_upload_extension - Hängen Sie die Dateierweiterung an die hochgeladene Datei an das Ziel an.
Datei-Upload - Arbeitsbeispiel
Lassen Sie uns das Tutorial-Modul ändern und eine Funktion zum Hochladen von Bildern hinzufügen.
Ändern Sie die Datenbanktabelle
Fügen wir das hinzu imagepath Spalte zur Buchtabelle durch Ausführen des folgenden SQL-Befehls -
ALTER TABLE `book` ADD `imagepath` VARCHAR(255) NOT NULL AFTER 'imagepath';
Aktualisieren Sie BookForm.php
Fügen Sie das Dateieingabeelement hinzu, um ein Bild in der Buchform hochzuladen - myapp / module / Tutorial / src / Model / BookForm.php.
Fügen Sie den folgenden Code in die ein __constructmethod der BookForm-Klasse.
$this->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array ('label' => 'Picture',),
));
Aktualisieren Sie Book.php
Nehmen Sie die folgenden Änderungen in der Book-Klasse vor: myapp / module / Tutorial / src / Model / Book.php.
Fügen Sie eine neue Eigenschaft hinzu imagepath für das Bild.
public $imagepath;
Aktualisieren Sie die getInputFilter Methode wie unten gezeigt -
Ergänzen Sie die FileInput Filter für Dateieingabeelement.
Stellen Sie die UploadFile Validierung zur Validierung des Dateieingabeelements.
Konfigurieren Sie die RenameUpload um die hochgeladene Datei an das richtige Ziel zu verschieben.
Die teilweise Codeliste lautet wie folgt:
$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);
Aktualisieren Sie die exchangeArray Methode, um die einzuschließen imagepathEigentum. Der Bildpfad kann aus einem Formular oder einer Datenbank stammen. Wenn der Bildpfad aus einem Formular stammt, ist das Format ein Array mit der folgenden Spezifikation:
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>
}
}
Wenn der Bildpfad aus einer Datenbank stammt, handelt es sich um eine einfache Zeichenfolge. Die teilweise Codeliste zum Parsen eines Bildpfads lautet wie folgt:
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;
}
Die vollständige Auflistung der Book Modell ist wie folgt -
<?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;
}
}
}
Aktualisieren Sie BookTable.php
Wir haben aktualisiert BookForm und die Book model. Jetzt aktualisieren wir dieBookTable und ändern Sie die saveBookMethode. Dies reicht aus, um den Bildpfadeintrag in das Datenarray aufzunehmen.$data.
Die teilweise Codeliste lautet wie folgt:
$data = array('author' => $book->author, 'title' => $book->title,
'imagepath' => $book->imagepath
);
Die vollständige Codeliste der BookTable Klasse ist wie folgt -
<?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: Informationen zum Hochladen von Dateien finden Sie in der $_FILES globales Array und es kann mit dem zugegriffen werden Request's getFiles()Methode. Führen Sie also sowohl die veröffentlichten Daten als auch die Informationen zum Hochladen von Dateien wie unten gezeigt zusammen.
$post = array_merge_recursive(
$request->getPost()->toArray(),
$request->getFiles()->toArray()
);
Die vollständige Auflistung der addAction() Methode ist wie folgt -
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);
}
Aktualisieren Sie die Ansicht der Datei add.phtml
Ändern Sie abschließend die Datei "add.phtml" und fügen Sie das Eingabeelement für die Bildpfaddatei wie unten gezeigt ein.
echo $this->formRow($form->get('imagepath'))."<br>";
Die vollständige Auflistung ist wie folgt -
<?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();
}
Führen Sie die Anwendung aus
Führen Sie die Anwendung abschließend unter aus http://localhost:8080/tutorial/add und fügen Sie die neuen Datensätze hinzu.
Das Ergebnis ist wie in den folgenden Screenshots dargestellt -
Form Page
Index Page