我使用以下代码,并成功上传本地计算机上的文件。它在我的本地计算机上显示“已成功上传”。
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved ) {
echo "Successfully uploaded";
} else {
echo "Not uploaded";
}
但是当我在我的在线服务器上使用此代码时,它不会上传文件而只显示消息“未上传”。
我如何知道问题是什么?如何才能将实际问题显示给用户?
答案 0 :(得分:39)
编辑代码如下:
// 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 = 价值:2;上传的文件超出了HTML表单中指定的MAX_FILE_SIZE指令。
UPLOAD_ERR_PARTIAL = 价值:3;上传的文件仅部分上传。
UPLOAD_ERR_NO_FILE = 价值:4;没有上传文件。
UPLOAD_ERR_NO_TMP_DIR = 价值:6;缺少临时文件夹。在PHP 5.0.3中引入。
UPLOAD_ERR_CANT_WRITE = 价值:7;无法将文件写入磁盘。在PHP 5.1.0中引入。
UPLOAD_ERR_EXTENSION = 价值:8; PHP扩展程序停止了文件上载。 PHP没有提供确定哪个扩展名导致文件上传停止的方法;使用phpinfo()检查加载的扩展名列表可能会有所帮助。
答案 1 :(得分:37)
检查Web服务器是否有权写入“images /”目录
答案 2 :(得分:34)
试试这个:
$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.';
}
这将立即标记任何文件权限错误。
答案 3 :(得分:16)
我怎么知道问题是什么
易。请参阅网络服务器的错误日志。
如何才能将实际问题显示给用户?
从不这样做 普通用户不会对此错误一无所知 恶意用户不应该收到任何反馈,特别是以非常有用的错误信息的形式。
只是显示一个借口的页面。
如果您无法访问服务器的错误日志,则您的任务会变得更加复杂 有几种方法可以与错误消息联系。
要在屏幕上显示错误消息,您可以将这些行添加到代码
ini_set('display_errors',1);
error_reporting(E_ALL);
或制作自定义错误日志文件
ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');
还有其他一些方法 但你必须明白,如果没有实际的错误信息,你就无法移动。在黑暗中很难盲目
答案 4 :(得分:5)
move_uploaded_file()
将返回:
FALSE
如果文件名无效FALSE
和issue a warning
PHP错误日志
我的php错误日志位于:/var/log/httpd/error_log
并出现以下错误:
警告:move_uploaded_file(images / robot.jpg):无法打开流:第78行/var/www/html/mysite/mohealth.php中的权限被拒绝
警告:move_uploaded_file():无法移动' / tmp / phpsKD2Qm'到' images / robot.jpg'在第78行的/var/www/html/mysite/mohealth.php
move_uploaded_file()
尝试将文件从临时目录移动到目标目录。当apache进程尝试移动文件时,它无法读取临时文件或写入目标目录。
查找哪个用户正在运行Apache(Web服务器)
通过以下命令检查哪个用户正在运行apache服务:ps aux | grep httpd
。第一列是用户名。
检查临时目录的读取权限:您可以通过在php页面中调用echo sys_get_tmp_dir();
来查找临时目录的路径。然后在命令行上发出ls -ld /tmp/temporary-dir
以查看apache用户是否有权阅读此处
检查目标目录的写入权限:问题ls -ld /var/www/html/destination-directory
以查看apache用户是否有权在此处写入
使用chown
或chgrp
使用sudo service httpd restart
答案 5 :(得分:2)
你检查文件上传了吗?也许你超过了max_post_size或max_upload_filesize。使用FileZilla登录时,您正在复制文件,当通过PHP wiritng上传时,此文件来自运行apache的用户(对于exaplme www-data),尝试将chmod 755用于图像。
答案 6 :(得分:1)
或运行suexec,永远不必再次更改权限。
答案 7 :(得分:0)
请检查您的form
标记是否具有此属性:
enctype="multipart/form-data"
答案 8 :(得分: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';
}
}
答案 9 :(得分:0)
在虚拟主机上检查您的disk quota
。
如果配额超出,move_uploaded_file
会返回错误。
PS:我一直在寻找这个问题:)
答案 10 :(得分:0)
请检查权限"图像/"目录
答案 11 :(得分:0)
我遇到了一个非常模糊和令人讨厌的错误原因6。 遍历了一些NFS挂载的卷之后,上传开始失败。 通过重启服务解决了问题
systemctl restart php-fpm.service
systemctl restart httpd.service
答案 12 :(得分:0)
在php.ini
中搜索 upload_max_size 和 post_max_size 。我遇到了同样的问题,解决方案是将这些值更改为大于文件大小的值。