出现的问题描述:
今天在实现一个在用户注册时上传头像图片文件的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

解决PHP move_uploaded_file函数移动图片失败的更多相关文章

  1. 在内存充足时malloc函数分配内存失败的原因及解决

    昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏.在这个思想的指导下,今天又是郁闷 ...

  2. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  3. springmvc异步上传图片并回调页面函数插入图片url代码示例

    <tr> <td class="search_td">属性值图片值:</td> <td> <input type=" ...

  4. Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转

     Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...

  5. 使用Python PIL库中的Image.thumbnail函数裁剪图片

    今天,是我来到博客园的第五天,发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢 ...

  6. PHP move_uploaded_file() 函数

    定义和用法 move_uploaded_file() 函数把上传的文件移动到新位置. 如果成功该函数返回 TRUE,如果失败则返回 FALSE. 语法 move_uploaded_file(file, ...

  7. nginx实现动态分离,解决css和js等图片加载问题

    改帖专门为使用nginx,通过nginx把请求转发到web服务器再返回客户端的时候,解决css和js和图片加载不出来的问题. 如果没安装nginx,请访问一下地址进行安装 http://www.cnb ...

  8. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

  9. 解决iOS中 tabBarItem设置图片(image+title切图在一起)时造成的图片向上偏移

    解决iOS中 tabBarItem设置图片(image+title切图在一起)时造成的图片向上偏移 解决办法1:设置tabBarItem的imageInsets属性 代码示例: childContro ...

随机推荐

  1. hdu 2586 How far away ?(离线求最近公共祖先)

    #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #i ...

  2. [问题记录.VisualStudio]VS2013无法新增和打开项目

    [问题描述] 1) 打开项目失败,报“项目文件只读”或“空引用”错误. 2) 无法新建项目,没有任何可用模板. 3) TFS都正常 [问题产生] 机器环境: 1) 装的Win10双系统,其中一个系统是 ...

  3. varnish

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. ReportViewer内存泄漏问题解决方案[上]

    做这个项目有点倒霉,快要验收的时候,发现微软ReportViewer控件的一个bug,导致我们的项目无法正常验收. 问题描叙:用ReportViewer本地模式做的报表,在ASP.NET页面中呈现.在 ...

  5. iOSDate时间格式(转)

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateForma ...

  6. Golang 文件服务器小结

    花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少. 学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出. 注:以下代码中,w为http.ResponseWriter ...

  7. updateEasyuiTab

    //tabContainer:easyui-tabs或者id,title名称 this.updateEasyuiTab = function (tabContainer, outTitle, outU ...

  8. gcc 常用命令行及解释

    gcc - GNU project C and C++ compiler   gcc [option] file...            preprocessing         compila ...

  9. 判断AngularJS渲染页面完成

    $scope.$on('$viewContentLoaded', function(){ }); // 或者 $scope.$watch('$viewContentLoaded', function( ...

  10. 多次drawRect,显示重叠,需要设置背景颜色

    自己写的一个控件,中途在setNeedsDisplay,重写drawRect方法,有时会把以前drawRect绘制上去,不知道为什么,后来设置了控件的背景颜色backgroundcolor,这个问题就 ...