文件上传可以通过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 评论