前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php文件上传(CentOS+apache+php)

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

作者头像
ExASIC
发布2021-05-24 14:47:00
3.7K0
发布2021-05-24 14:47:00
举报
文章被收录于专栏:ExASICExASIC

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

前端

注意以下几点:

  1. 1. method用post
  2. 2. enctype设multipart/form-data
  3. 3. input的name随意设, 会作为后端的关键字, 比如file
代码语言:javascript
复制
<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']里保存着这个临时文件的信息. 例如:

代码语言:javascript
复制
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请求处理结束后会自动删除.

代码语言:javascript
复制
# 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设置.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ExASIC 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前端
  • 后端
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档