2010-03-03 7 views
0

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.

+0

Pouvez-vous être plus précis sur ce que vous voulez faire en "annulant" le téléchargement? – blockhead

Répondre

0

Essayez if ($cancel->isChecked()) au lieu de if ($cancel == 'Cancel')

EDIT

Voici comment fonctionne le téléchargement de fichiers. Le formulaire est envoyé et le navigateur envoie le fichier via HTTP au serveur. PHP voit un formulaire avec enctype "multipart/form-data" et un élément de fichier, et enregistre ce fichier dans un emplacement temporaire. À ce stade, si vous appelez "Receive", il appelle en réalité dans les coulisses les fonctions PHP qui déplacent ce fichier hors de son emplacement temporaire.

Une fois que vous cliquez sur Envoyer, le navigateur envoie le fichier, que cela vous plaise ou non. Vous pouvez choisir d'ignorer le fichier, ce qui ressemble à ce que vous essayez de faire. Cependant, if ($cancel == 'Cancel'), ne regarde pas cela fonctionnera car la valeur est sensible à la casse. Pour éviter un code sujette aux erreurs comme celui-ci, if ($cancel->isChecked()) est préféré.

Pouvez-vous être un peu plus précis sur ce que vous essayez de faire exactement?

+0

C'est ainsi que je détecte que l'annulation a été appelée, et bien que ce soit probablement ce que je devrais faire, comment cela terminera-t-il le téléchargement? –

+0

J'ai élargi un peu ma réponse. – blockhead

+0

Après avoir fait beaucoup de recherches, je comprends que le fichier est transféré indépendamment de ce que vous faites. Vous avez raison d'essayer d'ignorer le fichier téléchargé et d'avoir modifié ma question. Toute la question "annuler" est une autre discussion. Tout d'abord, la sensibilité à la casse de ce que je fais est correcte, donc le code suit les chemins que je m'attendais à faire. J'ai lu un peu sur isChecked() et mon sentiment est que je dois charger le formulaire avec les données publiées avant de l'utiliser. Si c'est le cas, cela ne change que la disposition de base de mes actions (pas un gros problème). –

Questions connexes