欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

解决PHP move_uploaded_file函数因权限问题导致移动图片失败

程序员文章站 2021-11-28 11:20:50
...

今天在实现一个在用户注册时上传头像图片文件的PHP脚本时、出现了问题:PHP脚本在前面已经确定、浏览器端上传文件没有错误、上传的文件是合法的、上传的文件是图像文件、已经在服务器端生成了唯一的文件名、接下来我们应该做的就是把文件从临时位置移动到固定位置、于是乎我就写了以下脚本

//把文件从临时位置移动到固定位置
@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页面看到出错信息了


修改目标文件夹权限

不管怎么样、我们还是找到了问题的根源、这是一件很值得高兴的事情、既然文件夹所属用户和权限不对、那么我们只要修改这些问题即可:修改图片固定存放文件夹的所属用户、将其修改为运行apache执行PHP脚本的用户


将文件夹的权限改为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


这样我们就大功告成了、其实主要还是Linux系统的权限问题、一般情况下Web目录我们给我权限是775