当前位置:首页> PHP教程> php基础
关键字
文章内容
看到一个好的文件上传程序,转贴到家里,大家共享共品味
 
 
修改时间:[2011/10/27 00:27]    阅读次数:[867]    发表者:[起缘]
 
下午有个朋友让我帮忙写一个php的程序 发过来的需求是英文的
大致要求如下:
1. 将文件上传到根目录的upload目录中保存;
2. 文件名只能包含"a-z  A-Z  0-9"和 "_";
3. 文件名中如果含有非法字符,自动转换为"_";
4. 文件如果上传出错给出相应提示

查了一下php操作手册 花了1个多小时不断调试程序 把要求都满足了 在发源程序之前先给大家介绍一些相关的函数、全局变量和注意事项:

1. PHP支持HTML以POST的方法传输文件,但是form中必须声明enctype的属性="multipart/form-data",否则整个form表单将不起任何作用;

2. form表单中必须含有一个name为MAX_FILE_SIZE的隐藏域,这个隐藏域用来指定用户最大能上传的文件大小,必须声明在所有其他input标签之前;

3. $_FILES全局变量:一个包含上传文件所有信息的数组,具体属性如下:


引用内容

$_FILES['userfile']['name']
客户端机器文件的原名称。

$_FILES['userfile']['type']
文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。

$_FILES['userfile']['size']
已上传文件的大小,单位为字节。

$_FILES['userfile']['tmp_name']
文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error']
文件上传过程中的错误属性列表:

UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。

UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。

UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。

UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。



4. move_uploaded_file(string filename, string destination )函数:

引用内容

本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。

如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE。

如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。



5. file_exists()函数:判断文件是否存在 如果不存在返回false;

介绍完这些基本的函数 下面把源代码贴上来和大家分享

程序代码

<html>
<head>
<title>PHP文件上传程序</title>
</head>
<body>
<form name="upload_form" action="#" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="5000000" />
请选择您要上传的文件:<input name="upload_file" type="file" />
<input type="submit" value="上传" />
</form>
</body>
</html>
<?php
$upload_file
=$_FILES["upload_file"]["name"]; //获取文件名
$upload_tmp_file=$_FILES["upload_file"]["tmp_name"]; //获取临时文件名
$upload_filetype=$_FILES["upload_file"]["type"]; //获取文件类型
$upload_status=$_FILES["upload_file"]["error"]; //获取文件出错情况
$upload_dir="/websites/test/upload/"//指定文件存储路径

switch($upload_status)
 {
  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;
  case 
6:echo "没有找到临时文件目录。";break;
  case 
7:echo "文件写入失败。";break;
  } 
//分析文件出错情况并给出提示

$errorchar=array ("-"," ","~","!","@","#","$","%","^","&","(",")","+",",","(",")","?","!","“","”","《","》",":",";","——"); //定义非法字符集
foreach($errorchar as $char)
{
 if(
strpos($upload_file,$char)) 
  {
   
$upload_file=str_replace($char,"_",$upload_file);
   echo 
"文件名中含有非法字符!已经替换为"_"<br>";
   }
 }
//循环排除替换文件名中的非法字符

$upload_path=$upload_dir.$upload_file//定义文件最终的存储路径和名称

if(is_uploaded_file($upload_tmp_file) )
{
  
  if(
file_exists($upload_path)) echo "同名文件已经存在,请修改你要上传的文件名!"//检查是否有相同文件存在
  
else if(move_uploaded_file($upload_tmp_file,$upload_path)) echo "文件已经成功上传,点击查看<a href="upload/".$upload_file."" target="_blank">".$upload_file."</a>"//把文件从文件临时目录移动到上传目录
  
else echo"文件上传失败。";
}
?> 


(非常全面的一个php技术网站, 有相当丰富的文章和源代码.)