11
votes

Comment effectuer des téléchargements de fichiers avec PHP et le cadre Zend?

J'utilise Zend Framework 1.9.6. Je pense que je l'ai bien compris, sauf pour la fin. C'est ce que j'ai jusqu'à présent:

Formulaire: H2>
# /public/index.php
# Define path to uploads directory
defined('APPLICATION_UPLOADS_DIR')
    || define('APPLICATION_UPLOADS_DIR', realpath(dirname(__FILE__) . '/../data/uploads'));

# /application/forms/UploadFile.php
# Set the file destination on the element in the form
$file = new Zend_Form_Element_File('file');
$file->setDestination(APPLICATION_UPLOADS_DIR);

# /application/controllers/MyController.php
# After the form has been validated...
# Rename the file to something unique so it cannot be overwritten with a file of the same name
$originalFilename = pathinfo($form->file->getFileName());
$newFilename = 'file-' . uniqid() . '.' . $originalFilename['extension'];
$form->file->addFilter('Rename', $newFilename);

try {
    $form->file->receive();
    //upload complete!

    # Save a display filename (the original) and the actual filename, so it can be retrieved later
    $file = new Default_Model_File();
    $file->setDisplayFilename($originalFilename['basename'])
        ->setActualFilename($newFilename)
        ->setMimeType($form->file->getMimeType())
        ->setDescription($form->description->getValue());
    $file->save();
} catch (Exception $e) {
    //error
}


0 commentaires

3 Réponses :


13
votes

Par défaut, les fichiers sont téléchargés dans le répertoire temporaire système, ce qui signifie que vous allez soit:

  • Utilisez move_uploaded_file pour déplacer les fichiers ailleurs,
  • ou configurez le répertoire dans lequel Zend Cadre devrait déplacer les fichiers; Votre élément de formulaire doit avoir une méthode SETDESTINATION qui peut être utilisée pour cela.

    Pour le deuxième point, il existe un exemple dans Le manuel : xxx

    (mais lisez cette page: il y a d'autres informations utiles)


2 commentaires

+1 pour la configuration de la destination dans l'élément de formulaire et en pointant le manuel.


Le lien semble mort maintenant.



3
votes

Si vous deviez déplacer le fichier dans un répertoire public, tout le monde serait en mesure d'envoyer un lien à ce fichier à quelqu'un d'autre et que vous n'avez aucun contrôle sur qui a accès au fichier.

à la place, vous pourriez stocker Le fichier dans la DB en tant que longblob, puis utilisez le cadre Zend pour fournir aux utilisateurs accéder au fichier via un contrôleur / une action. Cela vous permettrait d'envelopper votre propre logique d'authentification et de permission de l'utilisateur autour de l'accès aux fichiers. P>

Vous aurez besoin d'obtenir le fichier à partir du répertoire / TMP afin de l'enregistrer à la DB: p >

<?php
header("Content-Disposition: attachment; filename=".$this->fileName.".".$this->fileNameSuffix);
header('Content-type: ".$this->fileMimeType."');
echo $this->file;
?>


1 commentaires

Merci d'avoir parlé de quoi faire une fois que l'utilisateur doit télécharger le fichier. Je vais mettre en œuvre une action de téléchargement comme vous l'avez mentionné.



0
votes
 $this->setAction('/example/upload')->setEnctype('multipart/form-data');
 $photo = new Zend_Form_Element_File('photo');
 $photo->setLabel('Photo:')->setDestination(APPLICATION_PATH ."/../public/tmp/upload"); 
 $this->addElement($photo);

0 commentaires