php文件上传(CentOS+apache+php)

Posted ExASIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php文件上传(CentOS+apache+php)相关的知识,希望对你有一定的参考价值。

php文件上传看起来简单,真的操作起来却有很多细节要注意。

前端

注意以下几点:

  1. 1. method用post

  2. 2. enctype设multipart/form-data

  3. 3. input的name随意设, 会作为后端的关键字, 比如file

<form action="handle.php" method="post" enctype="multipart/form-data">
<div>
<label>文件: </label>
<input type="file" name="file" id="file">
</div>
<div>
<button type="submit">确定</button>
</div>
</div>

后端

前端选择文件并点击"确定"后, 后台会收到后把文件保存在临时目录里, 我们需要对这个临时文件进行判断和过滤, 确认没有问题在移动到指定位置. 在PHP里$_FILES['file']里保存着这个临时文件的信息. 例如:

Array ( 
[name] => gvt21_centos7.tar.gz
[type] => application/x-gzip
[tmp_name] => /tmp/php1WOE4G
[error] => 0
[size] => 6524910
)

首先, 判断$_FILES['file']['error'], 如果不等于零就说明发生了错误. 出错值为1, 表示文件大小超了. 需要去php.ini里修改post_max_sizeupload_max_filesize. 默认值是2M, 很容易超了.

再做过滤, 就是文件类型不符或大小超出限制时, 提示出错.

第3步把临时文件移动到指定目录, 比如/upload/.

需要说明的是, /tmp/php1W0E4G就是完整的文件名. /tmp其实不是linux操作系统的/tmp, PHP默认是有安全保护的, 真实保存在/tmp/systemd-private-xxx-chronyd.service-TFl06N/tmp/php1WOE4G, post请求处理结束后会自动删除.

# get target file name
$file_full_name = $_SERVER["DOCUMENT_ROOT"] . "/upload/" . $_FILES['file']['name'];

# delete first, if already exists
if(file_exists($file_full_name)){
unlink($file_full_name);
}

$file_tmp_name = $_FILES['file']['tmp_name'];
if(move_uploaded_file($_FILES['file']['tmp_name'], $file_full_name) == false){
echo "Error: upload file failed";
die;
}

# other handle ...

注意: 要确保目标文件夹有写权限. 由于apache+PHP默认是以deamon的身份运行的, 所以需要提前用chmod设置.




欢迎关注ExASIC


分享数字集成电路设计中的经验和方法

分享让工作更轻松

以上是关于php文件上传(CentOS+apache+php)的主要内容,如果未能解决你的问题,请参考以下文章

docker搭建apache+php+mysql

php apache上传超过100兆视频时候,报错

使用 PHP/Apache 上传文件夹的正确权限是啥?

上传 900MB(或更大)文件:PHP、Apache、本地网络

上传 900MB(或更大)文件:PHP、Apache、本地网络

在腾讯云服务器centos7.5系统中lamp(centos7.5+apache+mysql+php)环境中安装ssl证书