2010-08-17 187 views
23

我使用下面的代码,它成功地上传我的本地机器上的文件。它在我的本地机器上显示“成功上传”。PHP move_uploaded_file()错误?

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded"; 
} 

但是,当我在我的在线服务器上使用此代码,那么它不上传文件,只是显示消息“未上传”。

如何知道问题是什么以及如何才能将实际问题显示给用户?

+1

你有Web服务器上的图像文件夹?该文件夹是只读还是可以写入也是? – gabe3886 2010-08-17 11:13:41

+0

任何PHP生成的错误消息?顺便说一句,你不需要使用$移动,你可以把move_uploaded_file命令放入语句中。 – fabrik 2010-08-17 11:14:23

+0

@all:这是它没有在服务器上显示任何错误/警告的问题。 Images文件夹存在,我可以使用FileZilla在这个文件夹中上传文件。 – Awan 2010-08-17 11:17:53

回答

33

检查Web服务器有权限写入“图像/”目录

+0

我可以使用FileZilla手动上传文件夹中的文件,这意味着它有权限。任何其他可能性? – Awan 2010-08-17 11:19:23

+10

FileZilla不能证明Web服务器有权限。 Web服务器很可能会在不同的用户下运行,而不是您自己。为确保它具有权限,只需将权限设置为777,然后进行测试。这应该证明它是否是许可问题或其他问题。 – 2010-08-17 11:33:12

+0

chown -R 777 yourdirectory – 2017-11-06 08:34:22

2

你会检查文件上传好吗?也许你超出了max_post_size或max_upload_filesize。当使用FileZilla登录时,您正在复制文件,当通过PHP wiritng上传时,此文件来自运行apache的用户(用于exaplme www-data),请尝试将chmod 755用于图像。

16

我怎么能知道是什么问题

容易。请参阅网络服务器的错误日志。

我怎样才能得到实际的问题展示给用户?

从来没有做到这一点。
一个普通用户不会发现这个错误。
恶意用户不应该得到任何反馈,尤其是以非常有用的错误消息的形式。

只是以借口显示一页。

如果您无法访问服务器的错误日志,则您的任务变得更加复杂。
有几种方法可以联系错误消息。

要显示屏幕上,你可以将这些行添加到代码

ini_set('display_errors',1); 
error_reporting(E_ALL); 

或进行自定义错误日志文件

ini_set('log_errors',1); 
ini_set('error_log','/absolute/path/tp/log_file'); 

还有一些其他方法错误消息。
但你必须明白,没有实际的错误信息,你不能移动。很难盲目的在黑暗中

+0

嗯,在开发网站上显示错误很好。将错误重定向到日志文件并不总是可能的(例如在共享主机上)。 – 2010-08-17 11:57:24

+0

@Pekka我们正在谈论一个现场的atm。而且,老实说,这种托管应该立即放弃。 – 2010-08-17 12:16:58

30

试试这个:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/"; 

if (is_dir($upload_dir) && is_writable($upload_dir)) { 
    // do upload logic here 
} else { 
    echo 'Upload directory is not writable, or does not exist.'; 
} 

这将立即举报任何文件权限错误。

+0

没有任何。而这种错误处理是无用的。 – 2010-08-17 12:17:35

+12

谨慎地阐述那些不了解的情况? – 2010-08-17 13:19:57

+1

说上传目录不可写或不存在。它是如何解决的,请解释一下? – 2016-10-27 07:27:07

1

或者运行suexec并且再也不需要更改权限。

5

move_uploaded_file()将返回:

  1. FALSE如果文件名无效
  2. FALSE并在错误日志issue a warning如果Apache进程没有读/写权限的源或目标目录

PHP错误日志

我的PHP错误日志是在:/var/log/httpd/error_log拥有了这些错误:

警告:move_uploaded_file(图片/ robot.jpg):未能打开流:权限在/ var/www/html等/ mysite的/ mohealth拒绝。上行PHP 78

警告:move_uploaded_file()以:无法在/var/www/html/mysite/mohealth.php移动 '/ TMP/phpsKD2Qm' 到 '图像/ robot.jpg' 上线78

move_uploaded_file()尝试将文件从临时目录移动到目标目录。当apache进程尝试移动文件时,它无法读取临时文件或写入目标目录。

  1. 找到哪个用户正在运行Apache(Web服务器) 检查该用户是通过这个命令运行Apache服务:ps aux | grep httpd。第一列是用户名。在临时迪尔

  2. 检查读取权限:您可以通过在PHP页面调用echo sys_get_tmp_dir();找到路径到temp目录。然后,在命令行上,看问题ls -ld /tmp/temporary-dir如果apache用户可以访问的目的地迪尔读到这里

  3. 检查写权限:问题ls -ld /var/www/html/destination-directory,看看apache用户可以访问这里写

  4. 使用chownchgrp

  5. 重启Apache添加的权限,必要时使用sudo service httpd restart

+0

如何在Windows中检查用户? – Black 2015-11-26 17:49:38

+1

问题是通过关键字“source”解决的。看看:“move_uploaded_file()将返回FALSE,并在错误日志中发出警告,如果apache进程不具有对”源“或目标目录的读/写权限。”因此,将所有权限授予您的项目目录是不够的,并且应该授予源文件位置的所有权限。 – Hasan 2015-12-05 06:17:36

22

编辑的代码如下:

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded because of error #".$_FILES["file"]["error"]; 
} 

它会给你下面的错误代码中的一个值1到8:

UPLOAD_ERR_INI_SIZE = 值:1;上传的文件超出了php.ini中的upload_max_filesize指令。

UPLOAD_ERR_FORM_SIZE = Value:2;上传的文件超出了HTML表单中指定的MAX_FILE_SIZE指令。

UPLOAD_ERR_PARTIAL = Value:3;上传的文件仅部分上传。

UPLOAD_ERR_NO_FILE = Value:4;没有文件上传。

UPLOAD_ERR_NO_TMP_DIR = Value:6;缺少临时文件夹。在PHP 5.0.3中引入。

UPLOAD_ERR_CANT_WRITE = Value:7;无法将文件写入磁盘。在PHP 5.1.0中引入。

UPLOAD_ERR_EXTENSION = Value:8; PHP扩展停止了文件上传。 PHP不提供确定哪个扩展导致文件上传停止的方法;使用phpinfo()检查加载的扩展列表可能会有所帮助。

0

请检查您的form标记有此属性:

enctype="multipart/form-data"

0
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/'; 
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"])) 
{ 
    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic); 
    if($moved) 
    { 
     echo "sucess"; 
    } 
    else 
    { 
     echo 'failed'; 
    } 
} 
0

在虚拟主机检查disk quota

如果配额超过,move_uploaded_file返回错误。

PS:我一直在寻找这个很长的时间:)