php 文件上传失败

使用OSX系统,在使用MAMP Pro作为虚拟服务器,并使用PHP作为后端语言进行文件上传,从临时文件夹拷贝文件的方法为

move_uploaded_file

代码如下:

 1 if($_FILES['file']['error']>0){
 2     echo 'file error';
 3 }else{
 4     echo 'upload:'.$_FILES['file']['name'].'<br>';
 5     echo 'type:'.$_FILES['file']['type'].'<br>';
 6     echo 'size:'.$_FILES['file']['size'].'<br>';
 7     echo 'stored in:'.$_FILES['file']['tmp_name'].'<br>';
 8     if (file_exists("upload/" . $_FILES['file']["name"]))
 9           {
10           echo $_FILES['file']["name"] . " already exists. ";
11           }
12         else
13           {
14           move_uploaded_file($_FILES['file']["tmp_name"],
15           "upload/" . $_FILES['file']["name"]);
16           echo "Stored in: " . "/Applications/MAMP/htdocs/learnPhp/upload/" . $_FILES['file']["name"];
17           }
18 }

运行报错:

[23-Mar-2016 22:01:39] PHP Warning:  move_uploaded_file(upload/visualize_pnas.py) [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: failed to open stream: Permission denied in /Applications/MAMP/htdocs/learnPhp/upload.php on line 18
[23-Mar-2016 22:01:39] PHP Warning:  move_uploaded_file() [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: Unable to move '/Applications/MAMP/tmp/php/phpBeg1Al' to 'upload/visualize_pnas.py' in /Applications/MAMP/htdocs/learnPhp/upload.php on line 18

主要报错为

failed to open stream: Permission denied

意思是,Php没有文件夹写权限,因为只有owner才有写权限。我们需要把这个文件夹的owner改为httpd的owner:

$ ps aux | grep httpd

结果为:

_www            68160   0.0  0.0  2487444    100   ??  S    10:10下午   0:00.00 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            68159   0.0  0.0  2487444    108   ??  S    10:10下午   0:00.01 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            68154   0.0  0.0  2487444    108   ??  S    10:10下午   0:00.03 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66607   0.0  0.0  2487444    108   ??  S     8:34下午   0:00.09 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66301   0.0  0.0  2487444    108   ??  S     8:15下午   0:00.06 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66294   0.0  0.0  2487444    108   ??  S     8:15下午   0:00.04 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66293   0.0  0.0  2487444    108   ??  S     8:15下午   0:00.06 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66292   0.0  0.0  2487444    108   ??  S     8:15下午   0:09.47 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66291   0.0  0.0  2487444    108   ??  S     8:15下午   0:07.27 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66290   0.0  0.0  2487444    108   ??  S     8:15下午   0:00.08 /Applications/MAMP/Library/bin/httpd -f /Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf -k start
_www            66097   0.0  0.0  2472172     76   ??  S     8:15下午   0:00.00 /Applications/MAMP/Library/bin/

第一列为_www,所以,httpd的owner是_www。

接下来修改文件夹的owner:

$ sudo chown _www /Applications/MAMP/htdocs/learnPhp/upload/ 

如果想让文件夹下面的所有文件都修改owner,则需要在上面的命令中增加-R:

$ sudo chown -R _www /Applications/MAMP/htdocs/learnPhp/upload/ 

这样就可以啦!我们现在验证一下:

看看这个文件夹的owner:

进入文件父目录:

$ cd /Applications/MAMP/htdocs/learnPhp/

查看子目录的owner:

$ ls -l 

结果为:

drwxr-xr-x  3 Yellow  admin  102  3 23 20:27 files
-rw-r--r--  1 Yellow  admin  277  3 23 19:42 index.html
drwxr-xr-x  4 _www    admin  136  3 23 23:07 upload
-rw-r--r--  1 Yellow  admin  792  3 24 10:50 upload.php
-rw-r--r--  1 Yellow  admin  275  3 23 21:10 welcome.php

我们可以看到upload文件夹的owner已经是_www了,不过,之后要是用户常规操作修改文件夹的时候系统就提示需要输入管理员密码了。

如果此时问题还没有解决,那就检查这个文件夹的owner是否有写权限,那要看第2-4个字符中有没有w。如果没有的话,在shell中执行以下命令:

$ sudo chmod -R 0755 /Applications/MAMP/htdocs/learnPhp/upload/

常见的权限代号如下:

-rw-------    (600) 只有所有者才有读和写的权限
-rw-r--r--    (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx------    (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x    (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx--x--x    (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw-    (666) 每个人都有读写的权限
-rwxrwxrwx    (777) 每个人都有读写和执行的权限

 

posted on 2016-03-24 11:28  nekoooo  阅读(552)  评论(0编辑  收藏  举报

导航