解决PHP move_uploaded_file函数移动图片失败

web 专栏收录该内容
12 篇文章 0 订阅

出现的问题描述:

今天在实现一个在用户注册时上传头像图片文件的PHP脚本时,出现了问题:PHP脚本在前面已经确定

  1. 浏览器端上传文件没有错误。
  2. 上传的文件是合法的。
  3. 上传的文件是图像文件。
  4. 已经在服务器端生成了唯一的文件名。

代码

接下来我们应该做的就是把文件从临时位置移动到固定位置,于是乎我就写了以下脚本:

//把文件从临时位置移动到固定位置
@move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename)
    or handle_error("存储图片文件出错", "移动文件出错" . "{$upload_filename}");

代码handle_error()函数是我自己定义的错误处理函数,当move_uploaded_file函数执行出错时,就会跳转到错误页,当我执行执行上面的脚本时,脚本跳转到了错误页,很明显是出错了,首先我排查了一下我的函数参数是否出现了错误:

$_FILES[$image_fieldname]['tmp_name']
$upload_filename //是我自己组合的文件路径,保证没错

根据PHP 手册,我传入函数的上述两个参数都是能保证没有问题的,这么怎么回事呢,页面中都没有报错(在函数的前面我使用了PHP的“@”运算符,所以页面才不会报错)

@运算符

注:在代码中要慎用PHP的 @ 运算符,
@运算符可以屏蔽掉所有可能来自用户输入无效的问题或者SQL查询包含了一个不正确的列、甚至是一个不规范URL 错误都可以避免了,代码甚至可以不检查由用户、自己或带那产生的错误,简而言之,@运算符可以屏蔽掉代码的错误信息,一个流行网站经常使用@,因为它们根本不能崩溃或者停止,但是在这种情形下要使用其他解决错误的方案。


寻找error log文件

当时我并没有意识到@运算符对出错信息的屏蔽,我就想去找apache的error log 错误日志文件看看,由于我在搭建PHP开发环境的时候使用的是xampp这样的开发套件,所以error_log文件跟网上大部分文章说的不一样,最终我在
(我的主机是 ubuntu)

/opt/lampp/logs

路径下找到了php_error_log文件,当然这个路径下还存放着apache的error_log文件,在php_error_log文件中我看到了出错问题:权限不够,我终于找到了出错的地方:我们存放图片的目的目录对执行PHP的用户来说是没有权限的,执行PHP脚本的用户和我写脚本代码、创建图片文件夹的用户不是同一个用户


其实我们本不用这么麻烦,我们只要将函数前面的@运算符去掉,然后去掉错误处理函数handle_error()函数,然后我们 就可以在web页面看到出错信息了。


修改目标文件夹权限

不管怎么样,我们还是找到了问题的根源,这是一件很值得高兴的事情,既然文件夹所属用户和权限不对,那么我们只要修改这些问题即可:

  1. 修改图片固定存放文件夹的所属用户,将其修改为运行apache执行PHP脚本的用户。
  2. 将文件夹的权限改为755

那么运行apache的用户是谁呢,我们利用PHP脚本获取:

echo exec('whoami'); //获得执行该文件的用户名,从而修改图片文件夹的权限

这样我得到了执行脚本的用户为:daemon,你们得到的很可能跟我的不一样。
下面我们来修改文件夹的所属用户:

chown daemon -R ~/web/hello_php/uploads

~/web/hello_php/uploads是我存放图片的目标路径,-R代表递归的给这个目录下的文件夹修改所属用户。

接着修改文件夹权限

chmod 775 -R ~/web/hello_php/uploads

这样我们就大功告成了,
重新刷新页面,提交表单,图片已经出现在目标路径中!
成功后的页面

  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值