2010-07-30 35 views
0

我上传文件到服务器使用PHP和虽然move_uploaded_file函数没有返回错误,该文件不在目标文件夹中。正如你所看到的,我正在使用从根目录开始的确切路径,并且正在上传的文件低于最大尺寸。为什么我的php移动文件脚本实际上移动文件?

$target = "/data/array1/users/ultimate/public_html/Uploads/2010/"; 
//Write the info to the bioHold xml file. 
$xml = new DOMDocument(); 
$xml->load('bioHold.xml'); 
$xml->formatOutput = true; 
$root = $xml->firstChild; 
$player = $xml->createElement("player"); 
$image = $xml->createElement("image"); 
$image->setAttribute("loc", $target.basename($_FILES['image']['name'])); 
$player->appendChild($image); 
$name = $xml->createElement("name", $_POST['name']); 
$player->appendChild($name); 
$number = $xml->createElement("number", $_POST['number']); 
$player->appendChild($number); 
$ghettoYear = $xml->createElement("ghettoYear", $_POST['ghetto']); 
$player->appendChild($ghettoYear); 
$schoolYear = $xml->createElement("schoolYear", $_POST['school']); 
$player->appendChild($schoolYear); 
$bio = $xml->createElement("bio", $_POST['bio']); 
$player->appendChild($bio); 
$root->appendChild($player); 
$xml->save("bioHold.xml"); 
//Save the image to the server. 
$target = $target.basename($_FILES['image']['name']); 
if(is_uploaded_file($_FILES['image']['tmp_name'])) 
    echo 'It is a file <br />'; 
if(!(move_uploaded_file($_FILES['image']['tmp_name'], $target))) { 
    echo $_FILES['image']['error']."<br />"; 
} 
else { 
    echo $_FILES['image']['error']."<br />"; 
    echo $target; 
} 

任何帮助表示赞赏。

埃里克R.

+0

什么从剧本出来(我指的是$目标...等) – 2010-07-30 14:22:43

+0

没有你的脚本对文件夹具有写权限? – Tim 2010-07-30 14:22:59

+0

它具有写权限和错误输出0,$ target输出路径和正确的文件名 – 2010-07-30 15:42:41

回答

0

大多数类似这样的权限问题。我会假设你不具备任何形式的直接shell访问直接检查这些东西,所以这里的如何从脚本内做到这一点:

如果存在检查$target目录:

$target = '/data/etc....'; 
if (!is_dir($target)) { 
    die("Directory $target is not a directory"); 
} 

检查它是否是可写的:

if (!is_writable($target)) { 
    die("Directory $target is not writeable"); 
} 

检查将全部目标文件存在/可写 - 也许它的存在,但不能被覆盖:

$target = $target . basename($_FILES['image']['name']); 
if (!is_writeable($target)) { 
    die("File $target isn't writeable"); 
} 

除此之外:

if(!(move_uploaded_file($_FILES['image']['tmp_name'], $target))) { 
    echo $_FILES['image']['error']."<br />"; 
} 

呼应了error参数这里是没有用的,这纯粹是指在上传过程。如果文件上传正确,但无法移动,则仍然只会回显0(例如,UPLOAD_ERR_OK常量)。检查错误的正确方法是这样的:

if ($_FILES['images']['error'] === UPLOAD_ERR_OK) { 
    // file was properly uploaded 
    if (!is_uploaded_File(...)) { 
     die("Something done goofed - not uploaded file"); 
    } 
    if (!move_uploaded_file(...)) { 
     echo "Couldn't move file, possible diagnostic information:" 
     print_r(error_get_last()); 
     die(); 

    } 
} else { 
    die("Upload failed with error {$_FILES['images']['error']}"); 
} 
+0

所以这是最正确的。问题解释:“Uploads”中的文件夹“2010”是可写的,因此所有检查都通过了,没有问题。但是,上传本身不可写入。做所有这些检查让我想到了这一点。所以当我使Uploads可写时,它运行得非常漂亮。谢谢马克。 – 2010-07-30 18:50:50

1

你需要确保不管是谁托管您的网页具有配置为允许你上传和移动文件的设置。大多数会禁用这些功能,因为它具有安全风险。

给他们发电子邮件,询问他们是否启用。

希望这会有所帮助。

+0

PS您是否在本地机器上测试过脚本。 – 2010-07-30 14:26:20

+0

截至去年,我能够上传到服务器。我会和他们核实一下。 – 2010-07-30 15:43:17

0

您对is_uploaded_file和move_uploaded_file的调用各不相同。对于is_uploaded_file,您正在检查'name',并且您正在传入'tmp_name'中的move_uploaded_file。尝试将您的调用更改为move_uploaded_file以使用“名称”

+0

'move_uploaded_file()'需要服务器端临时名称作为源,它位于'tmp_name'中。将它更改为'name'是错误的,因为这是客户端的原始文件名,这会导致移动失败,并显示'没有这样的文件'。 – 2010-07-30 15:07:44