引 言
在 Web 应用程序开发中,通常文件上传是不可缺少的功能.用户可以根据各种需求将文档资料或图像视频等资料上传到 Web 服务器.由于上传文件的类型、大小及编码方式的不同,开发者在设计上传模块时必须考虑到各种可能出现的问题.当客户端使用 HTTP 协议进行文件上传,文件上传过程是比较复杂的.根据网站上传文件的各种需求,开发为实现这些功能的类可以有效地解决文件上传问题.
1 文件上传过程介绍与配置文件设置
本 文 使 用 的 开 发 环 境 为 Wndows+A-pache+MySQL+PHP.PHP 可以实现多种浏览器上传文件.文件上传的过程其实就是一个文件复制的过程,客户端通过 HTTP 协议以 POST 方式将表单提交给服务器后,上传的文件被放置在临时目录里,服务器端脚本对文件进行进一步处理,一般是要将文件从临时目录移动到指定的目录中,需要使用函数move_uploaded_file 移动提交的文件,进而完成整个文件上传过程.
配置文件 php.ini 中设置参数如下
file_uploads :设为 On,允许通过 HTTP 上传文件upload_tmp_dir :文件上传至服务器时用于临时存储的目录,如果没指定,系统会使用默认的临时文件夹.
upload_max_filesize :允许上传文件大小的最大值,默认情况下 PHP 上传文件大小为 2 M,用户需要上传大于 2 M 的文件,但是利用 HTTP 协议又不能上传太大的文件,因此,需要适当修改相关参数.
upload_max_filesize 设置数值可以大于 2 M,即允许上传文件的最大值可以大于默认的 2 M.
post_max_size:PHP 可接收的 post 数据的最大值,该值应大于允许上传文件大小的最大值.设置post_max_size 数值可以大于 8 M,8 M 通常是通过表单 POST 给 PHP 的所能接收的最大值,包括表单里的所有值.
memory_limit:脚本所占的最大内存数,该值要大于允许上传的文件大小.
max_execution_time:脚本运行的最长时间(s),默认 30 S.
2 实现文件上传的类
定义一个上传类 upload,其构造函数如下.
function __construct ($fileArr, $savename, $savepath,
$fileformat, $overwrite = 0,$maxsize = 0) {
$this->file = $fileArr['file'];
$this->file_name = $fileArr['name'];
$this->file_size = $fileArr['size'];
$this->file_type = $fileArr['type'];
$this->get_ext();
$this->set_savepath($savepath);
$this->set_fileformat($fileformat);
$this->set_overwrite($overwrite);
$this->set_savename($savename);
$this->set_maxsize($maxsize);
}
在构造函数中,参数$fileArr 为文件数组,name为上传文件名,size 为上传文件大小,type 为上传文件类型,参数 savename 为文件保存名,参数 savepath 为文件保存路径,参数 fileformat 为文件格式,参数 over-write 指是否覆盖文件,参数 maxsize 为文件最大值.
接下来运行的程序要检查文件格式、检查目录是否可写入文件、检查文件是否已经存在、检查文件大小是否超过限制,然后使用 move_uploaded_file 函数上传文件,代码如下.
if (!$this->validate_format())
{
$this->errno = 1;
return false;
}
if(!@is_writable($this->savepath))
{
$this->errno = 2;
return false;
}
if ($this->overwrite == 0 && @file_exists($th-
is->savepath.$this->savename))
{
$this->errno = 3;
return false;
}
if ($this->maxsize != 0 )
{
if ($this->file_size > $this->maxsize)
{
$this->errno = 5;
return false;
}
}
if (!move_uploaded_file ($this->file, $th-
is->savepath.$this->savename))
{
$this->errno = 4;
return false;
}
3 文件上传解决方案
为了实现文件的上传,在 <form> 标记中,必须设置属性 enctype="multipart/form-data",服务器就会知道上传文件有表单数据.当文件上传时,上传文件将会保存在 windows 的临时目录中,通过 php.ini 文件upload_tmp_dir 设置,在默认情况下,该目录是 web服务器上的临时目录,脚本执行完毕后,该文件将被删除.
<form enctype="multipart/form-data" action=""
method="post">
<!—注意此处 enctype="multipart/form-data"//-->
<table width="400" height="100" border="1"
align="center" cellpadding="0" cellspacing="0" bordercol-
or="#008080" id="AutoNumber1" style="border-collapse: col-
lapse">
<tr bgcolor="#CCCCCC">
<td height="30" colspan="2" align="right"><div
align="center" class="style2"> 文件上传 </div> </td>
</tr>
<tr>
<td width="100" height="45" align="right"><div
align="center"><span class="style1">*</span> 文件上传地址:
</div></td>
<td width="300" height="45"><input type="file"
name="myupfile">
(大小〈2 M 比较合适)</td>
</tr>
<tr>
<td height="33" align="right" colspan="2">
<p align="center"><input type="submit" value=" 上
传 " name="add">
<input type="reset"
value=" 重置 " name="B2"></td>
</tr>
</table>
</form>
客户端与服务器通信使用超文本传输协议,服务器端接收客户端 POST 方法提交的数据,通过 PHP脚本语言取得文件数组,设置允许上传的文件类型、文件上传目录,然后创建类 upload 的对象,执行构造函数,进行各种检查,运行文件上传的程序段以实现文件的上传,最后释放对象.
<?php
include_once "upload.class.php";
if ($_POST[add]==" 上传 "){
$fileArr['file'] = $myupfile;
$fileArr['name'] = $myupfile_name;
$fileArr['size'] = $myupfile_size;
$fileArr['type'] = $myupfile_type;
echo $file;
echo $file_name;
$filetypes = array ('gif','jpg','jpge','png','doc'); // 所允许上
传的文件类型
$savepath = "upload/"; // 文件上传目录
$maxsize = 0;
$overwrite = 0;
$upload = new upload ($fileArr, $myupfile_name,
$savepath, $filetypes, $overwrite, $maxsize);
if (!$upload->run())
{
echo $upload->errmsg();
}
}
?>
4 结 论
本文设计的文件上传类的特点是:可以对文件上传进行控制,利用类创建的对象及其方法可以获得全部上传文件的信息,文件上传类使用方便;可以定制上传文件的大小、类型等.本文实现的文件上传类可以支持多文件上传、减低开发难度、节省开发时间,有效地实现文件的上传.
参考文献:
[1] Welling L,Thomson L.PHP 和 MySQL Web 开发[M].北京:清华大学出版社,2009.
[2] 张恩民.PHP 开发实战权威指南[M].北京:清华大学出版社,2012.
[3] 苏贵斌,马季骕.使用 JavaBeans 组件实现文件上传[J].内蒙古师范大学学报,2004(4):400-403.
[4] 李 斌.PHP 开发环境下文件上传的原理与实现[J].电脑开发与应用,2013(10):30-32.
网上购物系统对消费者来说,与传统实体店购物相比,消费者的交易时间没有限制,用户可随时随地进行购物,并且网上购物系统为消费者提供了大量的商品信息,能够迅速地查找信息,在熟悉网上购物流程后便可以大大节省时间,适合现代人群对购物的需求。...
网络受到越来越多人的喜爱, 使得网购业务不断拓展, 为人们带来更多的便利, 提高了社会运行效率。因此, 立足于PHP技术, 开展网上购物系统的设计与研究至关重要, 不仅能够优化网购流程, 并且能够为消费者提供更多元的服务, 刺激消费, 促进社会经济的长远发展。...
本文设计了一系列基于百度AI平台用Python语言完成的人工智能应用,程序由简到难,由单一功能模块到综合应用的开发,循序渐进,让学生逐步领会、掌握Python人工智能的应用开发。...
该文论述了一个基于PHP技术的学生宿舍管理系统的设计与开发,能够提高学生住宿信息的完整性和时效性,提高管理工作的效率。...
当前网上购物以其方便快捷等优势成为了很多消费者青睐的消费模式。高校师生更是将此作为购物的首选,每日各大高校都有着数量巨大的邮递快件,各快递公司都在高校成立了快递接收与寄送代理点,但通过电话或者短信等方式让老师、同学领取快递的方式严重影...