2011-06-20 113 views
0

这是我的脚本:错误文件上传

$today = mktime(0, 0, 0, date("m"), date("d"), date("y")); 
$b= date("m/d/y", $today);  

if ($_FILES["file$i"]["error"] > 0) 
     { 
     echo "Return Code: " . $_FILES["file$i"]["error"] . "<br />"; 
     } 
     else 
     { 
     // echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
     // echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
     // echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
     // echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 
      $upload=$_FILES["file$i"]["name"]; 
      $fileName = preg_replace('/[^\w\._]+/', '', $upload); 
      $filup=$b.$fileName; 
      echo $filup; 
     if (file_exists("upload/" . $filup)) 
      { 
      echo $_FILES["file$i"]["name"] . " already exists. "; 
      } 
     else 
      { 
      move_uploaded_file($_FILES["file$i"]["tmp_name"], 
      "upload/" . $filup); 
      $path="upload/" . $filup; 
      $temp="Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 
      $sql="insert into album(uid,path,cid,title) values('$uid','$path','$cid','$text[$i]') "; 
      mysql_query($sql) or die(mysql_error()); 
      } 
     } 

它显示我此错误:

Warning: move_uploaded_file(upload/06/20/113.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\wamp\www\demo\editedfileupload\pr1\upload_file.php on line 31

第31行是:

echo $_FILES["file$i"]["name"] . " already exists. "; 
+0

鉴于警告说'move_uploaded_file(upload/06/20/113.jpg)',我猜想第31行实际上是'move_uploaded_file($ _ FILES [“file $ i”] [“tmp_name”],“upload/“。 $ filup);'。你确定这个文件存在吗? – jtbandes

+0

是这个文件存在,如果我使用$上传而不是使用$ filup,它工作正常。当我使用日期时间戳时,只有这样才会出现以下错误。 – user799100

+0

难道是Windows不允许文件和文件夹名称中带有正斜杠,就像您在日期中使用的那样? – Ben

回答

1

我认为你的问题是$filup是不是你可能认为它是。当你在做$filup=$b.$fileName;时,你可能会无意中改变文件的完整路径。例如,假设:

$b = "06/20/11" 
$fileName = "testfile" 

然后做$filup=$b.$fileName;后,$ filup将变为:

$filup = "06/20/11testfile" 

所以,当你使用$ filup在file_exists()或move_uploaded_file()以什么可能发生的是$ fileup中的斜杠是用于目录分隔符而不是文件名。

所以检查(file_exists(“上传/ 06/20/11testfile”)总是失败,当它进入move_uploaded_file,它说:“没有这样的文件或目录”。

请考虑删除前的斜线$ b或者使用“ - ”来代替,我认为即使是逃避“/”也可以,但如果没有特别的理由让斜杠保持简单,我建议保持简单。使用绝对路径进行文件系统操作。

希望这会有所帮助。

+0

@ user799100:我想我的回应也解释了你的评论上面 - “是这个文件存在,如果我使用$上传而不是使用$ filup,它工作正常。当我使用日期时间戳,只有那么下面的错误发生” – Abhay

1

我不知道为什么你认为第31行是你选择的行,但肯定的错误是由以下代码引起的:

move_uploaded_file($_FILES["file$i"]["tmp_name"], "upload/" . $filup); 

现在,通常情况下,我会说这是一个CHMOD问题,但有一些奇怪的事情发生,我不太熟悉(因为您正在从Windows系统中工作)。检查CHMOD,如果修复它,对你有好处,但除此之外,请解释变量$b包含正斜杠的可能性? Windows以反斜线工作(这在PHP中也是如此)。看看改变斜杠是否会有所作为。

编辑:根据您对自己的帖子的评论,我很确定这个问题是由正斜杠引起的。您仍然可以使用$fileName变量,但要确保$b变量不包含正斜杠。此外,在行if (file_exists("upload/" . $filup))move_uploaded_file($_FILES["file$i"]["tmp_name"], "upload/" . $filup);,将正斜杠更改为反斜杠。