首页 » 建站技术 » PHP 技术 » 浏览内容

PHP 4.0 时尚编程百例 —  实例 38  文件上传


2005-05-17 13:51:28 5,795 0 发表评论 字体: 作者:C.K.
标签: 时尚编程百例

体验版 88 元,个人版 128 元,多用户版 288元个人版160元升级到多用户版。

实例说明

本例将介绍如何用PHP 4.0 把客户端任何类型的文件上传到服务器端。文件上传是网站应用中一个极为常见的应用问题,也是目前网站的一个基本功能。比如企业上传产品图片(BMP、JPG、GIF类型的文件)、个人上传简历(Word类型文件)或者将其他类型的文件上传到服务器。

PHP 能够接受任何来自符合 RFC-1867 标准的浏览器(包括 Netscape Navigator 3 及更高版本,Microsoft Internet Explorer 3 加微软补丁,或者更高版本)上传的文件。PHP 的这种特性使得我们既可以上传文本文件,也可以上传二进制文件。利用 PHP 的认证和文件操作函数,您就可以控制谁有上传的权限,以及在文件上传后进行哪些处理。

编程思路

本实例中文件上传主要是利用form表单提交一个File对象给服务器。其中 File 对象必须包含 Multipart/form-data 的 enctype 属性.MAX_FILE_SIZE 是一个隐含的表单变量,用来限制上传文件的最大字节数。同时考虑到大文件上传容易造成超时的情况,所以可以用 set_time_limit($TimeLimit) 来加大超时限制时间。

表单提交后,PHP 将检测上载的文件。文件存放在服务器上的一个临时目录中.同时生成—个与文件域同名的几个变量,如 _name 代表文件名称,_size代表文件大小的字节数,_type 代表文件MIME类型。由于临时目录下的文件近期会被删除,所以必须利用函数move_uploaded_file将文件拷贝到指定的路径或重新命名。

创作步骤

一、创建客户端文件上传的表单

请选择文件:




MAX_FILE_SIZE 隐藏域(单位为字节)必须先于文件输入域,其值为接收文件的最大尺寸。同时,要保证您的文件上传表单中要有 enctype=”multipart/form-data”,否则文件上传将不能工作。

警告 :
MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。实际上,PHP 设置中的上传文件最大值,是不会失效的。但是最好还是在表单中加上 MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。

二、通过$_FILES 数组获取相关的变量

这些数组将包含所有关于您上传的文件的信息,

我们假设文件上传字段的名称为 userfile。名称可随意命名。

$_FILES['userfile']['name']

客户端机器文件的原名称。

$_FILES['userfile']['type']

文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。

$_FILES['userfile']['size']

已上传文件的大小,单位为字节。

$_FILES['userfile']['tmp_name']

文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error']

和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。

接受上传文件的 PHP 脚本必须在文件上传后进行判断,来决定接下来要对该文件进行那些操作。例如,您可以通过 $_FILES['userfile']['size'] 变量来忽略尺寸太大或太小的文件,也可以通过 $_FILES['userfile']['type'] 变量来过滤文件类型和某种标准不相符合的文件。在 PHP 4.2.0 以上版本,您还可以通过 $_FILES['userfile']['error'] 变量来根据不同的错误代码来做相关的判断。不管做何种的判断,您必须将该文件从临时目录中删除,要么将其移动到其它的地方。

如果表单中没有选择上传的文件,则 PHP 变量 $_FILES['userfile']['size'] 的值将为 0,$_FILES['userfile']['tmp_name'] 将为 none。

如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。

文件被上传后,默认地会被储存到服务端的默认临时目录中,除非您将 php.ini 中的 upload_tmp_dir 设置为了其它的路径。服务端的默认临时目录可以通过更改 PHP 运行环境的环境变量 TMPDIR 来重新设置,但是在 PHP 脚本内部通过运行 putenv() 函数来设置是不起作用的。该环境变量也可以用来确认其它的操作也是在上传的文件上进行的。

三、本例程序代码


上载文件表单

请选择文件:



$upload_file=$_FILES&91;'upload_file'&93;&91;'tmp_name'&93;;
$upload_file_name=$_FILES&91;'upload_file'&93;&91;'name'&93;;
$upload_file_size=$_FILES&91;'upload_file'&93;&91;'size'&93;;

if($upload_file){
$file_size_max = 1000*1000;// 1M限制文件上传最大容量(bytes)
$store_dir = “d:/fileupload/”;// 上传文件的储存位置
$accept_overwrite = 1;//是否允许覆盖相同文件
// 检查文件大小
if ($upload_file_size > $file_size_max) {
echo “对不起,你的文件容量大于规定”;
exit;
}

// 检查读写文件
if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
echo “存在相同文件名的文件”;
exit;
}

//复制文件到指定目录
if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo “复制文件失败”;
exit;
}

}

Echo “

你上传了文件:”;
echo $_FILES&91;'upload_file'&93;&91;'name'&93;;
echo “
“;
//客户端机器文件的原名称。

Echo “文件的 MIME 类型为:”;
echo $_FILES&91;'upload_file'&93;&91;'type'&93;;
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
echo “
“;

Echo “上传文件大小:”;
echo $_FILES&91;'upload_file'&93;&91;'size'&93;;
//已上传文件的大小,单位为字节。
echo “
“;

Echo “文件上传后被临时储存为:”;
echo $_FILES&91;'upload_file'&93;&91;'tmp_name'&93;;
//文件被上传后在服务端储存的临时文件名。
echo “
“;

$Error=$_FILES&91;'upload_file'&93;&91;'error'&93;;
switch($Error){
case 0:
Echo “上传成功”; break;
case 1:
Echo “上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值.”; break;
case 2:
Echo “上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。”; break;
case 3:
Echo “文件只有部分被上传”;break;
case 4:
Echo “没有文件被上传”;break;
}
?>

网站统计 Statistics

  • 创建时间: 2005年1月3日 距今5064 天
  • 日志总数: 2461
  • 评论总数: 630
  • 标签总数: 654
  • 链接总数: 273
  • 最后更新: 2018-8-31 17:57:04
  • 您是本站第 14156397 位访客

广告区 Guǎng Gào