PHP 主要是同过POST方法上传文件,文件上传后,会被存储到服务器段的临时目录中(默认的是系统临时文件目录,可以通过修改PHP文件中的 upload_tmp_dir 选项来改变临时目录),然后需要用 PHP 中的 move_upload_file() 函数将其移动到指定位置。
上传文件的所有信息被包含在一个全局二维数组$_FLFS种。该数组共5个元素,元素的第一个下标表示表单的文件上传元素名,第二个下标是下面5个预定下标之一,分别描述了上传文件的属性(upload-name 是表单中上传文件标记的名称)。
- $_FILSH['upload-name'] ['name']:从客户端向服务器上传文件的文件名。
- $_FILSH['upload-name] ['type']:上传的文件MIME类型。这个变量是否赋值取决于浏览器的功能。
- $_FILSH['upload-name] ['size']:上传的文件大小。
- $_FILSH['upload-name] ['tmp-name']:上传之后,将此文件移动到最终位置之前赋予的临时文件。
- $_FILSH['upload-name] ['error']:上传文件状态码,有7种可能取值。
7种可能的上传的状态码如下:
- UPLOAD_ERR_OK:文件上传成功;
- UPLOAD_ERR_INI_SIZE:文件大小超出 upload_max_filesize 所指定的最大值,该值在PHP配置文件中设置;
- UPLOAD_ERR_FROM_SIZE:文件大小超出 MAX_FILE_SIZE 隐藏表单域参数(可选);
- UPLOAD_ERR_PARTLAL:文件至上传了一部分;
- UPLOAD_ERR_NO_FILE:上传表单中没有制定文件;
- UPLOAD_ERR_NO_TMO_DIR:找不到临时文件;
- UPLOAD_ERR_CANT_WRITE:文件写入失败。
move_upload_file()函数的用法如下:
bool move_uploaded_file ( string $filename , string $destination);
其中 $filename 为上传的文件名, $destination 为上传文件的最终目的的地址。如果 $filename 不适合法的上传文件或者由于某些原因无法移动文件,则 move_uploaded_file() 将返回FALSH,并输出警告信息。
例如:
1
1 0){ 8 echo "错误:: " . $_FILES["file"]["error"] . ""; 9 }else{10 echo "上传文件名: " . $_FILES["file"]["name"] . "";11 echo "文件类型: " . $_FILES["file"]["type"] . "";12 if (file_exists("/home/liuyu/www/upload/upload/" . $_FILES["file"]["name"])){13 echo $_FILES["file"]["name"] . " 文件已经存在。 ";14 }else{15 $str = move_uploaded_file($_FILES["file"]["tmp_name"], "/home/liuyu/www/upload/upload/" . $_FILES["file"]["name"]);16 echo md5($str);17 //echo "文件存储在: " . "/home/liuyu/www/upload/upload/" . $_FILES["file"]["name"];18 }19 }20 }else{21 echo "非法的文件格式";22 }
上传文件的表单中, <from>的属性必须设置为 enctype="multipart/form-data" , <input> 标签的类型 type 必须是 file ,用来在浏览器断限制上传文件大小的隐藏域的名称必须为MAS_FILE_SIZE,其值的单位为字节。
运行结果:
如果上传失败,有可能是PHP配置文件纵某项配置不能满足上传该文件的需要。首先,打开PHP配置文件中的 file_uploads 选择必须打开,然后检查 upload_max_filesize 选项值,它被用来设置上传文件大小的上限,如果上传文件的大小超过这个限制将不会被服务器接受,同时表单MAX_FILE_SIZE 也被用来限制文件的大小,但它的值不能大于 upload_max_filesize 的值。此外,内存限制 memory_limit、脚本执行时间的限制 max_execution_time、脚本接收输入时间限制 max_input_time、POST 大小限制 post_max_size等,都会影响上传文件,可以适合当增大这些值来保证文件的成功上传。
上传文件或图片进行重命名是我们在php上传中会碰到的一个问题了,在重命名无非就是对你上传的文件生成一个随机的字符串了,包括有Md5,随机,或按时间日期来重命名了,下面我来给介绍一下。
1 0){ 5 echo "错误: " . $_FILES["file"]["error"] . ""; 6 }else{ 7 echo "上传文件名: " . $_FILES["file"]["name"] . ""; 8 echo "文件类型: " . $_FILES["file"]["type"] . ""; 9 echo "上传大小: " . ($_FILES["file"]["size"] / 1024) . " Kb";10 echo "临时上传文件: " . $_FILES["file"]["tmp_name"] . "";11 $uptype = explode(".", $_FILES["file"]["name"]);12 $newname = $date.".".$uptype[1];13 //echo($newname);14 $_FILES["file"]["name"] = $newname;15 if (file_exists("/home/liuyu/www/upload/upload/" . $_FILES["file"]["name"])){16 echo $_FILES["file"]["name"] . " already exists. ";17 }else{18 $_FILES["file"]["name"] = move_uploaded_file($_FILES["file"]["tmp_name"],"/home/liuyu/www/upload/upload/" . $_FILES["file"]["name"]);19 echo "";20 }21 }22 }else{23 echo "上传失败";24 }
$newname = $date.".".$uptype[1]; //将文件名重写成系统时间
运行结果:
上传文件和修改上传文件重名就做好。