PHP文件上传

文件上传可以通过HTTP协议来实现。要使用文件上传功能,首先要在配置文件php.ini中对上传做一些设置,然后通过预定义常量$_FILES对上传文件做一些限制和判断;最后通过move_uploaded_file()函数实现上传。


配置php.ini文件

实现上传功能,首先要在php.ini中开启文件上传,并对其中的一些参数作出合理的设置,找到 File Uploads 项,可以看到下面的3个属性值,表示的含义如下。

1、file_uploads:如果值是on,说明服务器支持文件上传,如果为off,则不支持。

2、upload_tmp_dir:上传文件临时目录。在文件被成功上传之前,文件首先存放到服务器端的临时目录中。如果要指定位置,就在这里进行设置。否则使用系统默认目录即可。

3、 upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,用户可以自行设置。

除了File Uploads项,还有几个属性也会影响到上传文件的功能。

4、max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒。

5、memory_limit:PHP中一个指令所分配的内存空间,单位是MB。

php.ini文件配置完成后,需要重新启动Apache,配置才能生效



预定义变量$_FILES

$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大的作用。该变量是一个二维数组。

保存的信息如下表

元素名称

说明

$_FILES[filename][name]

存储了上传文件的文件名,如test.txt,tu.jpg

$_FILES[filename][size]

存储了文件大小,单位为字节

$_FILES[filename][tmp_name]

文件上传时,首先在临时目录中被保存成一个临时文件。该变量为临时文件名。

$_FILES[filenam][type]

上传文件的类型。

$_FILES[filename][error]

存储了上传文件的结果。如果返回0,则说明文件上传成功。

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;没有文件被上传, 值:5; 上传文件大小为0         


注意:

用form上传文件时,一定要加上属性内容enctype="multipart/form-data",否则用$_FILES[filename]获取文件信息时会报异常。

     

例如:

实现一个上传文件域,通过$_FILES变量输出上传文件的资料,代码如下:

<form action="" method="post" enctype="multipart/form-data">
<!--上传文件域,type类型为file-->
<input type="file"  name="upfile">
<!--提交按钮-->
<input type="submit" name="submit" value="上传">
</form>
<!--处理表单返回结果-->
<?phpif(!empty($_FILES)){
foreach($_FILES['upfile'] as $name=>$value){
echo $name.'='.$value.'<br>';}}
?>

运行结果为:


文件上传函数

PHP中应用move_uploaded_file()函数实现文件上传。

move_uploaded_file()函数将指定文件上传到服务器中指定的位置。如果成功则返回true,否则返回false。语法如下:

bool move_uploaded_file(string filename,string destination)

参数filename指定上传文件的临时文件名,即$_FILES[tmp_name];参数destination指定文件上传后保存的新路径和名称。

例如:

前提需要先创建upfile文件夹

创建一个上传表单,允许上传2MB以下、格式为JPG的图片文件,将上传文本保存在根目录下的upfile文件夹下,上传成功浏览该目录,代码如下:

<meta charset="UTF-8">
<!--上传表单必须要有enctype属性-->
<form action="" method="post" enctype="multipart/form-data"><!--上传文件域,type类型为file--><input type="file"  name="up_file"><!--提交按钮--><input type="submit" name="submit" value="上传">
</form>
<!--处理表单返回结果-->
<?phpif(!empty($_FILES[up_file][name])){//判断是否有上传文件$fileinfo=$_FILES[up_file];//将文件信息赋给变量$fileinfo$type=strstr($fileinfo['name'],'.');if($type!=".jpg"){echo "您上传的文件格式不正确!";}else{if($fileinfo['size']<2097152&&$fileinfo['size']>0){//判断文件大小$path="upfile/".$_FILES["up_file"]["name"];//定义上传文件的路径move_uploaded_file($fileinfo['tmp_name'],$path);//上传文件//上传成功后浏览该目录if(is_dir("upfile/")){//判断文件名是否为目录$dir=scandir("upfile/");//使用scandir()函数取得所有文件和目录foreach($dir as $value){echo $value.'<br>';}}else{echo '目录路径错误!';}}else{echo "文件大小不符合要求";}}}
?>

运行结果如下:

注:

此方法上传图片的时候,在电脑上看文件名的时候会中文乱码(因为电脑上中文是用gb2312编码的)

我提供了两种解决方案:

1:转换编码,将名字换成gb2312,然后重新命名文件名,读取的时候再转换成UTF-8

if(!empty($_FILES[up_file][name])){//判断是否有上传文件$fileinfo=$_FILES[up_file];//将文件信息赋给变量$fileinfo$type=strstr($fileinfo['name'],'.');if($type!=".jpg"){echo "您上传的文件格式不正确!";}else{if($fileinfo['size']<2097152&&$fileinfo['size']>0){//判断文件大小$file_name=iconv("UTF-8","gb2312", $_FILES["up_file"]["name"]);//将UTF-8编码转换成gb2312$path="upfile/".$file_name;//定义上传文件的路径move_uploaded_file($fileinfo['tmp_name'],$path);//上传文件//上传成功后浏览该目录if(is_dir("upfile/")){//判断文件名是否为目录$dir=scandir("upfile/");//使用scandir()函数取得所有文件和目录foreach($dir as $value){echo iconv("gb2312","UTF-8", $value).'<br>';//将gb2312编码转换成UTF-8}}else{echo '目录路径错误!';}}else{echo "文件大小不符合要求";}}
}

2:重新命名文件名为英文+数字的组合(可以利用时间起名字)











本文链接:https://my.lmcjl.com/post/9750.html

展开阅读全文

4 评论

留下您的评论.