簡體   English   中英

如何使用PHP和Zend Framework進行文件上傳?

[英]How to do file uploads with PHP and the Zend Framework?

我正在使用Zend Framework 1.9.6。 我想除了最后我已經弄明白了。 這是我到目前為止:

形成:

<?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
        ));
    }
}

控制器:

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;
    }
}

現在我該怎么處理這個文件? 它默認上傳到我的/tmp目錄。 顯然,這不是我想保留它的地方。 我希望我的應用程序的用戶能夠下載它。 所以,我認為這意味着我需要將上傳的文件移動到我的應用程序的公共目錄,並將文件名存儲在數據庫中,以便我可以將其顯示為URL。

或者首先將其設置為上傳目錄(盡管我在嘗試執行此操作時遇到了錯誤)。

您之前是否使用過上傳過的文件? 我應該采取的下一步是什么?

解:

我決定將上傳的文件放入data/uploads (這是指向我的應用程序之外的目錄的sym鏈接,以使其可以訪問我的應用程序的所有版本)。

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

默認情況下,文件會上傳到系統臨時目錄,這意味着您將:

  • 使用move_uploaded_file將文件移動到其他地方,
  • 或配置Zend Framework應移動文件的目錄; 你的表單元素應該有一個可以用於它的setDestination方法。

對於第二點, 手冊中有一個例子:

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

(但請閱讀該頁面:還有其他有用的信息)

如果您要將文件移動到公共目錄,任何人都可以將該文件的鏈接發送給其他任何人,並且您無法控制誰有權訪問該文件。

相反,您可以將文件作為longblob存儲在DB中,然后使用Zend Framework為用戶提供通過控制器/操作訪問文件的權限。 這將允許您圍繞訪問文件包裝自己的身份驗證和用戶權限邏輯。

您需要從/ tmp目錄中獲取該文件,以便將其保存到db:

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

您在控制器中查看的操作將具有您的授權邏輯,然后從db加載行:

// 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;

然后在視圖中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM