PHP ve Zend Framework ile dosya yükleme yapmak nasıl?

2 Cevap php

Ben Zend Framework 1.9.6 kullanıyorum. Ben hemen hemen sonuna dışında anladım var düşünüyorum. Bu ben bugüne kadar ne var:

Form:

<?php

class Default_Form_UploadFile extends Zend_Form
{
    public function init()
    {
        $this->setAttrib('enctype', 'multipart/form-data');
        $this->setMethod('post');

        $description = new Zend_Form_Element_Text('description');
        $description->setLabel('Description')
            ->setRequired(true)
            ->addValidator('NotEmpty');
        $this->addElement($description);

        $file = new Zend_Form_Element_File('file');
        $file->setLabel('File to upload:')
            ->setRequired(true)
            ->addValidator('NotEmpty')
            ->addValidator('Count', false, 1);
        $this->addElement($file);

        $this->addElement('submit', 'submit', array(
            'label'    => 'Upload',
            'ignore'   => true
        ));
    }
}

Controller:

public function uploadfileAction()
{
    $form = new Default_Form_UploadFile();
    $form->setAction($this->view->url());

    $request = $this->getRequest();

    if (!$request->isPost()) {
        $this->view->form = $form;
        return;
    }

    if (!$form->isValid($request->getPost())) {
        $this->view->form = $form;
        return;
    }

    try {
        $form->file->receive();
        //upload complete!
        //...what now?
        $location = $form->file->getFileName();
        var_dump($form->file->getFileInfo());
    } catch (Exception $exception) {
        //error uploading file
        $this->view->form = $form;
    }
}

Şimdi dosya ile ne yapacağız? Varsayılan olarak benim /tmp dizine tarih olmuştur. Onu nerede muhafaza edeceğinize Açıkçası bu değil. Benim uygulama kullanıcıları indirmek mümkün olmak istiyorum. Yani, ben bu yüzden ben bir url olarak görüntüleyebilirsiniz benim uygulama kamu dizinine yüklenen dosyayı taşımak ve veritabanı dosya adını saklamak gerekir demektir düşünüyorum.

(Daha önceki yapmaya çalışırken ben hataları içine koşuyordu olsa) ya da ilk etapta yükleme dizini olarak ayarlayabilirsiniz.

Eğer daha önce yüklenen dosyalar ile çalıştınız mı? Ben almalıdır sonraki adım nedir?

Solution:

(Benim uygulamanın tüm sürümleri için erişilebilir yapmak için benim uygulama dışında bir dizine bir sym bağlantı olduğu) data/uploads içine yüklenen dosyaları koymaya karar verdim.

# /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
}

2 Cevap

Varsayılan olarak, dosya ya kadar olacak demektir, Sistem geçici dizine yüklenir:

Ikinci nokta için, bir örnek var içinde the manual:

$element = new Zend_Form_Element_File('foo');
$element->setLabel('Upload an image:')
        ->setDestination('/var/www/upload')
        ->setValueDisabled(true);

(But read that page : there are other usefull informations)

Eğer bir kamu dizine dosya taşımak için olsaydı, kimse kimseye bu dosyaya bir bağlantı göndermek mümkün olacak ve dosyaya erişimi olan kişiler üzerinde hiçbir kontrole sahip.

Bunun yerine, bir longblob olarak DB dosya depolamak ve daha sonra kullanıcıların bir denetleyici / eylem yoluyla dosyaya erişmek sağlamak için Zend Framework kullanabilirsiniz. Bu dosyalara erişim etrafında kendi kimlik ve kullanım izni mantığı kaydırmak izin istiyorum.

Sen db kaydetmek için / tmp dizininden dosya almak gerekir:

// I think you get the file name and path like this:
$data = $form->getValues(); // this makes it so you don't have to call receive()
$fileName = $data->file->tmp_name; // includes path
$file = file_get_contents($fileName);

// now save it to the database. you can get the mime type and other
// data about the file from $data->file. Debug or dump $data to see
// what else is in there

Görüntüleme için denetleyicisi eylem yetkilendirme mantığı var ve daha sonra db satır yükleyebilirsiniz:

// is user allowed to continue?
if (!AuthenticationUtil::isAllowed()) {
   $this->_redirect("/error");
}

// load from db
$fileRow = FileUtil::getFileFromDb($id); // don't know what your db implementation is

$this->view->fileName = $fileRow->name;
$this->view->fileNameSuffix = $fileRow->suffix;
$this->view->fileMimeType = $fileRow->mime_type;
$this->view->file = $fileRow->file;

Sonra görünümünde:

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