ExASIC
分享让工作更轻松

php文件上传(Centos7)

前端

注意以下几点:

  1. method用post
  2. enctype设multipart/form-data
  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>

frontend

后端

前端选择文件并点击"确定"后, 后台会收到后把文件保存在临时目录里, 我们需要对这个临时文件进行判断和过滤, 确认没有问题在移动到指定位置. 在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设置.

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: 白山头IC技术圈问答ReCclayCrazyFPGA