2013-10-28 164 views
0

好吧,我已经搜索了一个答案,我找不到任何帮助。我尝试使用while循环和forloop,但只有一个文件上传。这是我的代码。上传多个文件Php

形式:

<form method="post" enctype="multipart/form-data" action="process.php"> 
<div id="filediv"> 
<div id="imagefiles"> 
<input type="hidden" name="MAX_FILE_SIZE" value="2000000"> 
<label>Upload File: 
<input name="userfile[]" type="file" id="userfile" multiple></label> 
<label>Alt Text: <input name="alt" type="text"></label> 
</div> 
</div> 

下面是上传功能:

$alt=mysqli_real_escape_string($conn, $_POST['alt']); 
foreach($_FILES['userfile']['tmp_name'] as $key => $tmp_name){ 
if (($_FILES["userfile"]["error"] == 0) && ($_FILES['userfile']['size'] > 0)) 
{ 
$fileName = $_FILES['userfile']['name'][$key]; 
$tmpName = $_FILES['userfile']['tmp_name'][$key]; 
$fileSize = $_FILES['userfile']['size'][$key]; 
$fileType = $_FILES['userfile']['type'][$key]; 
} else{ 
    echo"error"; 
} 

$allowedExts = array("jpg", "jpeg", "gif", "png"); 
$extension = end(explode(".", $_FILES["userfiles"]["name"])); 
if((($_FILES["userfile"]["type"] == "image/gif") 
    ||($_FILES["userfile"]["type"]=="image/jpeg") 
    ||($_FILES["userfile"]["type"]=="image/png") 
    ||($_FILES["userfile"]["type"]=="image/pjpeg") 
    && in_array($extension, $allowedExts))) 
    { 
     $fp = fopen($tmpName, 'r'); 
     $content =fread($fp, filesize($tmpName)); 
     $SourceImage = imagecreatefromstring($content); 
     $SourceWidth = imagesx($SourceImage); 
     $SourceHeight=imagesy($SourceImage); 
     $DestWidth=100; 
     $DestHeight=130; 
     if ($SourceHeight> $SourceWidth) 
     {$ratio = $DestHeight/$SourceHeight; 
     $newHeight = $DestHeight; 
     $newWidth = $sourceWidth * $ratio; 
     } 
     else 
     { 
      $ratio = $DestWidth/$SourceWidth; 
      $newWidth = $DestWidth; 
      $newHeight = $SourceHeight * $ratio; 
     } 
     $DestinationImage = imagecreatetruecolor($newWidth, $newHeight); 
     imagecopyresampled($DestinationImage, $SourceImage, 0,0,0,0,$DestWidth, $DestHeight, $SourceHeight, $SourceWidth); 
     ob_start(); 
     imagejpeg($DestinationImage); 
     $BinaryThumbnail = ob_get_contents(); 
     ob_end_clean(); 
     $thumb = addslashes($BinaryThumbnail); 
     $content = addslashes($content); 
     fclose($fp); 
     $fp  = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 

     mysqli_query($conn, "INSERT INTO files (username, name, size, content, type, link, alt, thumbnail) VALUES ('$username', '$fileName', '$fileSize', '$content', '$fileType', 1, '$alt', '$thumb')") or die('Error, query failed'); 
      echo "<script>alert('The file has been uploaded');location.replace('uploaded.php');</script>"; 
      unlink ($_FILES['username']['tmp_name']); 
    }else{ 
      echo "<script>alert('Please upload an image');location.replace('upload.php');</script>"; 
    } 

} 
} 

我意识到,我并不需要一半我的代码。现在我有一个图像上传,但不能再一次。

+0

这与此相关吗? http://stackoverflow.com/questions/1361673/get-raw-post-data – jdog

+0

我不认为这是它。第一个文件不会上传,但不会超过一个。我的循环,我试过它不起作用。 – Pureblood

+0

当我尝试你的html时,$ _FILES是完全空的。我不确定PHP是否支持multiple属性,因此我建议查看原始HTTP数据 – jdog

回答

0

我可能是错的,我不知道我曾经编写了一个$ _FILE阵列....但我认为这个问题是在这里

while ($_FILES["userfile'"]["tmp_name"][$counter]){ 

除了额外的报价我不认为数据不存储这样的...你可以尝试做的print_r($ _ FILES)

这可能是

$_FILES["userfile"][$counter]["tmp_name"] 

,但实际上,我怀疑这是否会甚至工作。只是遍历$ _FILE阵列本身来处理文件的动态数量....这里是我使用的功能....

public static function upload($file, $accountDirectory, $uploadDirectory) 
{ 
    $return = array(); 
    if(!file_exists($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) { 
     $return["result"] = false; 
    } 
    if($file['error'] != UPLOAD_ERR_OK) { 
     $return["result"] = false; 
      switch($file['error']){ 
      case 0: //no error; possible file attack! 
       echo "There was a problem with your upload."; 
       break; 
      case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini 
       echo "The file you are trying to upload is too big."; 
       break; 
      case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form 
       echo "The file you are trying to upload is too big."; 
       break; 
      case 3: //uploaded file was only partially uploaded 
       echo "The file you are trying upload was only partially uploaded."; 
       break; 
      case 4: //no file was uploaded 
       echo "You must select an image for upload."; 
       break; 
      default: //a default error, just in case! :) 
       echo "There was a problem with your upload."; 
       break;    
      }   
    } else { 
     $newFileName = preg_replace("/[^a-zA-Z0-9-.]/", "", $file["name"]); 
     $uploadLocation = $accountDirectory . $uploadDirectory . $newFileName; 
     while (file_exists($uploadLocation)) { 
      $uploadLocation = $accountDirectory . $uploadDirectory . time() . $newFileName; 
     } 
     if (move_uploaded_file($file["tmp_name"],$uploadLocation)==true) { 
      $return["file"] = str_replace($accountDirectory, "/",$uploadLocation); 
      $return["result"] = true; 
     } else { 
      $return["result"] = false; 
     } 
    } 
    return $return; 
} 
0

这样做$_FILES['userfile']$_FILES['file'],你只指通过上传的文件上传带有这些名称的字段(分别为userfilefile)。 $_FILES是一个关联数组,所以你应该这样做

foreach ($_FILES as $fieldName => $fileProperties) { 
    // do something 
} 

另外请注意,你有$_FILES["userfile'"]大约有十几个线下;额外的'将打破这条线。

查看the PHP help files了解更多信息。

+0

谢谢。你让我意识到我甚至不需要我的代码的一部分。 – Pureblood

+0

很高兴帮助! –

+0

我仍然无法获取要上传的多个文件。我添加了foreach($ _ FILES ['userfile'] ['tmp_name']作为$ key => $ tmp_name){但它不起作用。 – Pureblood