四、关于Zend_File_Transfer组件
如同Zend框架的其他强大组件旨在简化我们的开发任务那样,Zend_File_Transfer组件旨在简化从用户的计算机向web服务器上传文件的工作。实际上,这个组件在处理文件上传方面非常灵活,它可以使用诸如FTP和WebDAV协议来传送文件,不过我们这里只讨论它的最初设计意图。让我们首先创建最简单上载动作处理,不过它仍能接收和处理一个上载的文件,如下所示:
01 public function uploadAction()
02 {
03
04 if ($this->getRequest()->isPost()) {
05
06 $upload = new Zend_File_Transfer_Adapter_Http();
07
08 $upload->setDestination($this->config->uploads->product->supplements);
09
10 if ($upload->receive()) {
11 echo "The file has been uploaded!";
12 }
13
14 }
15
16 }
为了在下面的描述中轻松引用代码,我们这里为动作代码添加了相应的行号。
- 04行的代码确定POST请求是否已经提交给了该动作。这对于创建为用户呈现表单以及通过表单提交数据的动作来说都非常有用。
- 06行的代码调用Zend_File_Transfer类组件,并使用了能够处理通过Web表单提交的数据的HTTP适配器。
- 08行的代码用于设置文件上传的最终目的地。虽然可以直接向该方法传递一个路径,不过我发现将路径存放到application.ini文件中然后根据需要检索配置参数会更加方便一些。 这允许我们依照要求轻松更改目的地路径,当我们的代码从开发工作站迁移到生产服务器时这一点格外有用。
- 10行的代码负责接收文件,并将其移动到要求的目的地。
或许您觉得这难以置信,但是这短短的十六行代码的确能够接收并将上传来的文件移动到服务器的预定位置! 然而,现在还不要高兴得太早,因为该脚本缺少接收用户输入时应具备的一个关键步骤,因为这个脚本允许用户上传任意文件,这是万万不可的! 幸运的是,Zend_File_Transfer组件带有检查文件上传处理方面能够想到的所有方面的数据验证方法。
五、对上载的文件进行检验
我们至少希望检查被上传文件的一个或者几个关键特性,如文件的大小,或者MIME类型等。实际上,有多种方法可以用来检索这些特性。举例来说,为了检索文件的MIME类型,我们可在接收文件之后调用getMimeType()方法,具体代码如下所示:
echo "The file type is {$upload->getMimeType()}";
}
如果我们向服务器上传了一个PDF文件,并调用了getMimeType方法,那么将会返回application/x-pdf。当用户只应上传特定类型的文件时,这个方法非常有用。下面是一个例子:
$upload->receive();
echo "File received";
} else {
echo "Please upload a PDF";
}
当然,检查文件大小或者类型只是证实过程的一小部分而已。为了简化验证工作,您可能希望在接收被上传的文件之前来进行这些工作,实际上Zend_File_Transfer组件已经为我们提供了18个验证方法。Zend框架文档提供了这些验证函数的完整说明。我们可能用到的验证函数之一便是ImageSize,它能检查一个被上载图像的大小,以便确保其大小介于给定的最大和最小尺寸之间。在某些情况下,这可能非常有用,例如在需要保持缩略图尺寸保持一致的时候。下面的例子将确保所有上传的图像都为PNG类型,同时其大小符合160×160像素的要求:
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->setDestination($this->config->uploads->product->supplements);
$upload->addValidator('MimeType', false, 'image/png');
$upload->addValidator('ImageSize', false,
array('minwidth' => 160,
'maxwidth' => 160,
'minheight' => 160,
'maxheight' => 160)
);
if ($upload->isValid()) {
$upload->receive();
echo "File received";
} else {
echo "Please upload a file of type PNG and dimensions 160x160 pixels.";
}
}
六、进一步阅读
如今,用户驱动的内容已经成为Web的关键组成部分,所以项目的成功可能会取决于数据从用户到web服务器的传送效率。在为用户提供数据上传功能的时候,Zend框架的Zend_File_Transfer组件可以极大的降低开发工作的复杂性!
如果您想进一步了解Zend_File_Transfer组件,请参考Zend框架的Zend_File组件文档;另外,PHP手册的文档也有文件上载方面的介绍;此外,Zend_ProgressBar组件的进一步信息请参考Zend框架的Zend_ProgressBar文档。
希望本文能够对您有所帮助。