• 技术文章 >php教程 >php手册

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

    2016-10-08 16:04:42原创681

    出现的问题描述:
    今天在实现一个在用户注册时上传头像图片文件的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
    这样我们就大功告成了,

    参考阅读:http://www.manongjc.com/article/1494.html

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:解决PHP move_uploaded_file函数移动图片失败
    上一篇:awesome-php中英文资源整理(同步更新) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 用PHP实现小型站点广告管理(修正版)• php实现refresh刷新页面批量导入数据的方法• Yii2如何批量添加数据,Yii2批量添加数据• 用Xdebug修正PHP应用程序中的错误• PHP下打开phpMyAdmin出现403错误的问题解决方法
    1/1

    PHP中文网