简述php文件上传原理

文件上传的原理

当我们点击提交表单时,会将file文件域里面的文件,先上传到临时的目录(可以在php的配置文件中设置),默认的临时目录是c:/windows/temp,

如果需要持久的保存,需要通过php的函数move_uploaded_file()移动到指定的位置,如果不移动,当php脚本执行结束,临时文件就会消失。

文件上传相关知识

文件上传,其实也是通过表单提交的。

form表单:
action属性应该指向一个php文件
method属性必须设置为post
enctype属性:
取值:

application/x-www-url-encoded (默认)只能上文本数据
multipart/form-data 可以上传多 种类型的数据(上传文件)

表单提交的数据分为如下两种:
(1)字节流数据:输入框、单选框、复选框、多行文本域等都是通过字节的数据传输到服务器,服务器通过$_GET $_POST接收(enctype=‘application/x-www-url-encoded’)
(2)二进制文件流的形式;当需要提交一些文件的时候,由于文件采用的二进制的形式进行编码,所以需要先将二进制文件转码,然后再提交到服务器(enctype=‘multipart/form-data’)

文件提交的时候,需要通过input type=”file” 文件域上传

服务器接收的时候,通过$_FILES进行接收,并且通过$_FILES服务端可以控制文件上传的格式、大小与做错误处理

在前端可以对上传的文件类型,大小进行限制:

<!--表单隐藏域对上传大小进行限制-->
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<!--accept 对文件类型限制-->
<input type="file" name="myfile" accept="image/jpeg,image/png">

注意限制是以字节为单位
在服务器端也要做响应的限制:

header('Content-type:text/html;charset=utf-8');
$myfile=$_FILES['myfile'];
//获取文件数组['myfile']的属性tmp_name与name
//$tmp=$myfile['tmp_name'];
//$picname=$myfile['name'];
//windows采用GBK编码,PHP采用utf-8编码,需要改变文件名的编码格式
//$picname=iconv('utf-8','GBK',$picname);
//将零时文件$tmp移动到指定目录userpic并命名为$picname
//copy($tmp,"userpic/".$picname);

$size=$myfile['size'];//获取文件大小
$MaxSize=2097152;//设置最大允许字节
$type=$myfile['type'];//获取图片类型
$AllowTypr=array('image/jpeg','image/png','image/gif');//允许类型数组
if ($error==0){//为0,代表上传成功
  if ($size>$MaxSize){
    echo "<script>alert('文件大小超过限制');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }
  if (!in_array($type,$AllowTypr)){
    echo "<script>alert('请上传正确图片类型');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }

错误处理

$error=$myfile['myfile']['error'];
  if ($error==0){//为0,代表上传成功
    if (move_uploaded_file($tmp,"userpic/".$picname)) {
      echo "移动文件成功";
    }else{
      echo "移动文件失败";
    }
  }else{//不为0,匹配错误信息
    switch ($error){
      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 7://文件写入失败
      case 8:
        echo "系统错误";
        break;
    }
  }

文件上传配置

PHP.ini文件中的file uploads部分定义了相关文件上传配置,

file_uploads=On         开启HTTP上传
upload_tmp_dir          临时文件保存目录
upload_max_filesize=2M  最大上传文件大小
post_max_size=8M        POST方式传输最大数据值
max_file_uploads        一次上传最大文件数
memory_limit=128M       单线程最大内存占用量
max_excution_time=-1    脚本解析所允许的最大执行时间(s),默认为-1未开启

copy、rename与move_uploaded_file区别

copy()复制文件 - 您现在有2个文件,对于大文件,这可能需要很长时间

rename()更改文件的名称,这可能意味着在目录之间移动它。

move_uploaded_file()与rename()基本相同,但它仅适用于通过PHP上传机制上传的文件。这是一项安全功能,可防止用户欺骗您的脚本向他们展示与安全相关的数据。

多文件上传

前端

<form action="" method="post" enctype="multipart/form-data">  
    <input type="file" name="file[]"/><hr>  
    <input type="file" name="file[]"/><hr>  
    <input type="submit" name="submit" value="提交" />  
</form>  

服务端,多文件、单文件处理逻辑一样

$array = $_FILES['file']['name'];  
$length = count($array);  
for($i=0;$i<$length;$i++){  
    echo "文件名为".$array[$i]."<br>";  
    echo "原先保存位置: " . $_FILES["file"]["tmp_name"][$i]."<br>";  
    move_uploaded_file($_FILES["file"]["tmp_name"][$i],"./upload/" . $array[$i]);  
    echo "提交后保存位置: " . "./upload/里的" . $array[$i]."<br>";  
} 

获取文件mime类型几种方法

说明:
多用途internet邮件扩展,mime类型的出现,跟着电子邮件出现的
早期,发送电子邮件的时候,里面可能会附带一些附件,计算机系统根据附件的类型找到对应的设备打开,例如:传输的是视频,就会找到视频播放器去打开,如果传输的是网页文件,那么会自动使用浏览器去打开

MIME类型,包括2个部分:第一个部分是该文件所属的一个大类,第二个部分是文件细节小类,

例如:
text/html,属于文本文件,html这样的文本文件
image/jpg,属于图像大类,jpg这种类型的图像

1、php上传文件获取MIME类型:$_FILES[‘uploadfile’][‘type’]

2、mime_content_type或Fileinfo函数

echo mime_content_type('php.gif') ."\n";//输出image/gif
echo mime_content_type('test.php'); //输出text/plain

$finfo    = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);

3、image_type_to_mime_type()获取图片MIME类型
该函数用来判断一个 IMAGETYPE 常量的 MIME 类型,如果需要判断MIME类型的文件只有图像文件,那么首先可以使用exif_imagetype()函数获取图像类型常量,再用image_type_to_mime_type()函数将图像类型常量转换成图片文件的MIME类型。

注意:需要在php.ini中配置打开extension=php_mbstring.dll(Windows需要)和extension=php_exif.dll

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

参考链接:
https://www.cwhello.com/10062.html
http://www.viiis.cn/news/show_36704.html
https://www.iteye.com/blog/570109268-2413455
https://www.thinbug.com/q/3924016
https://www.youranshare.com/push/manual/php-manual/3927.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值