J'expérimente en téléchargeant des fichiers dans un Zend_Form en utilisant le fichier Zend_Form_Element_File en faisant quelque chose comme ça dans mon formulaire afin que le téléchargement puisse être géré par mon contrôleur (ce qui dans mon cas est de faire un nouveau nom de fichier).Comment annuler un téléchargement de fichier Zend Form?
$element = new Zend_Form_Element_File('Upload');
$element->setDestination(UPLOAD_PATH)
->setValueDisabled(true);
$submit = new Zend_Form_Element_Submit('submit');
Dans l'action du contrôleur je puis le code (très simplifié) comme ceci qui fonctionne bien:
$form = new MyForm();
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$form->Upload->receive();
$this->_redirect('/nextAction');
} else {
$form->populate($formData);
}
}
Cependant (et ici il vient) ce que je veux faire est d'avoir un bouton d'annulation sur ma forme traitée comme ceci:
[Form]
$cancel = new Zend_Form_Element_Submit('cancel');
[Controller]
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
$cancel = $this->getRequest()->getPost('cancel');
if ($cancel == 'Cancel') {
$this->_redirect('/nextAction');
}
if ($form->isValid($formData)) {
$form->Upload->receive();
$this->_redirect('/nextAction');
} else {
$form->populate($formData);
}
}
le problème commence lorsque l'utilisateur sélectionne un fichier via « Télécharger » et résultats « annuler » pour sortir de l'action. Le formulaire ne connaît pas la différence entre "Soumettre" et "Annuler" et lance le transfert depuis la fin du navigateur. À la fin du serveur, la fonction receive() n'est pas appelée et bloque tout le processus.
Dans cette ancienne question (non-Zend) SO "Cancel a webform submit with php", la réponse suggérée est d'avoir le bouton Annuler dans un formulaire séparé. Je ne pense pas que ce soit ce que je veux faire dans un système basé sur Zend.
Dans cette ancienne question du forum (Zend) "Zend Form Element File upload issues" la réponse proposée pour annuler un téléchargement est de faire quelque chose comme ceci:
if ($cancel == 'Cancel') {
unlink($form->Upload->getValue());
$this->_redirect('/nextAction');
}
Je l'ai essayé et il semble fonctionner, mais je ne sais pas pourquoi et quand je regarde derrière les rideaux, je vois en fait qu'il génère une erreur de la forme:
Attention: unlink (
<filename>
): Aucun fichier ou répertoire dans<line in controller code where unlink() call is>
Donc, ma grande question est quelle est la meilleure façon d'annuler le téléchargement de fichiers? (Et ce que fait le unlink faire - même avec l'erreur)
Modifier 3/3
Pour clarifier les choses, le téléchargement de formulaire HTML sont assez stupide. Si vous avez plusieurs boutons de soumission sur un formulaire qui a un élément Fichier, peu importe le bouton de soumission que vous semblez utiliser, le fichier est transféré dans le répertoire de téléchargement temporaire sur votre serveur.
Mais Zend essaie d'être intelligent, il vous permet de reporter la copie du fichier du répertoire temporaire à la destination finale via "setValueDisabled (true)" dans le formulaire et "receive()" dans le contrôleur. Cependant, si vous lancez un téléchargement dans le formulaire, mais que vous n'appelez pas "receive() dans le contrôleur, l'ensemble du processus Zend semble se bloquer (le navigateur annonce continuellement" loading "et ne fait rien d'autre).
Je suis à la recherche d'une solution basée sur Zend (ou php pur) pour sauvegarder le téléchargement du fichier côté serveur, après le fichier est arrivé dans le répertoire temp, mais avant un appel pour "recevoir (La méthode "unlink" semble fonctionner, mais elle jette aussi un avertissement et comme je n'ai aucune idée de pourquoi cela fonctionne, je me méfie de ce qui se passe réellement.
Pouvez-vous être plus précis sur ce que vous voulez faire en "annulant" le téléchargement? – blockhead