带循环的多文件上传

时间:2012-02-07 08:27:09

标签: php database upload

我目前有这个脚本,用户(使用可以上传最多7张图像的表单)可以将多个图像上传到文件夹,图像名称可以上传到我的数据库,但没有任何成功。请帮忙。

if (isset($_POST['submit'])) { $ref_49 = $_POST['ref_49'];
    $name = $_POST['name'];
    $contact = $_POST['contact'];
    $email = $_POST['email'];
    $rent_sell = $_POST['rent_sell'];
    $heading = $_POST['heading'];
    $price = $_POST['price'];
    $limitedtextarea = $_POST['limitedtextarea'];
    $type = $_POST['type'];
    $where = $_POST['where'];
    $address = $_POST['address'];
    $bedroom = $_POST['bedroom'];
    $bathroom = $_POST['bathroom'];
    $garages = $_POST['garages'];
    $carports = $_POST['carports'];
    $granny_flat = $_POST['granny_flat'];
    $ref_99 = $_POST['ref_99'];
    $fulldesc = $_POST['full_desc'];

    if ($ref_99=="") {
    $full_ad = "yes";
    } else {
    $full_ad = "no";
    }
    $todays_date = date("Y-m-d");
     mkdir("gallery/" . $_POST["name"], 0777); 

for ($i = 0; $i < 7; $i++) 
{
    $file_name = $_FILES['uploadFile' . $i]['name'];
    // strip file_name of slashes
    $file_name = stripslashes($file_name);
    $file_name = str_replace("'", "", $file_name);
    // $copy = copy($_FILES['uploadFile'. $i]['tmp_name'], "gallery/" . $_POST["name"] . "/" . $file_name);

    if ((($_FILES['uploadFile' . $i]["type"] == "image/gif") 
      || ($_FILES['uploadFile' . $i]["type"] == "image/jpeg") 
      || ($_FILES['uploadFile' . $i]["type"] == "image/pjpeg")) 
      && ($_FILES['uploadFile' . $i]["size"] < 200000000)) 
    {
        if ($_FILES['uploadFile' . $i]["error"] > 0) 
        {
            $message = "Return Code: " . $_FILES['uploadFile' . $i]["error"] . "<br />";
        }
        else
        {
            $query = "INSERT INTO property (

                    name, contact, email, type_of_listing, rent_sell, address, prop_desc, area, price, main_image, image_1, image_2, image_3, image_4, image_5, image_6, heading, bathroom, bedroom, garages, carports, granny_flat, full_description, full_ad, 49_ref, 99_ref, listed 

                ) VALUES (

                    '{$name}', '{$contact}', '{$email}', '{$type}', '{$rent_sell}', '{$address}', '{$limitedtextarea}', '{$where}', '{$price}', '{$photo_1}', '{$photo_2}', '{$photo_3}', '{$photo_4}', '{$photo_5}', '{$photo_6}', '{$photo_7}', '{$heading}', '{$bathroom}', '{$bedroom}', '{$garages}', '{$carports}', '{$granny_flat}', '{$fulldesc}', '{$full_ad}', 'ref_49_{$ref_49}', 'ref_99_{$ref_99}', ''
                )";
            $result = mysql_query($query, $connection);

            if (file_exists("gallery/" . $_POST["name"] . "/" . $_FILES['uploadFile' . $i]["name"])) 
            {
                $message = "<h3>" . $_FILES['uploadFile' . $i]["name"] . " already exists.</h3>";
            }
            else
            {
                move_uploaded_file($_FILES['uploadFile' . $i]["tmp_name"], "gallery/" . $_POST["name"] . "/" . $_FILES['uploadFile' . $i]["name"]);
                $message = "File: " . $_FILES['uploadFile' . $i]["name"] . " uploaded.";
            }
        }
    }
    else
    {
        $message = "<h3>Invalid file or no file selected.</h3><br />• Only JPEG OR GIF allowed.<br />• Size limited may not exceed 200KB.<br /><a href = \"local_artist.php\">Return</a>";
    }
}
}

}

2 个答案:

答案 0 :(得分:0)

这里可能会出现很多问题。你有没有尝试将其分解成碎片?你确定DB正在连接吗?你确定php有权写入它试图写入的目录吗?你确定这些目录存在......等等。等

注释掉绝大多数代码,并开始逐个测试所有组件,或者在try / catch中包装东西,看看产生了什么错误。

[编辑] 如果只在上传&lt; 7个文件然后问题在于你已经将7硬编码到你的循环中了!

循环显示实际上传的文件数量,而不是固定数量。

假设它们全部按顺序命名(并从0开始),你可以测试循环中是否存在散列的FILE值,只需保持摄取直到它出现null(可能很好添加限制器以确保它不能永远持续下去)

像这样......

[编辑2]修改条件以包括文件大小测试

for($i=0;  $_FILES['uploadFile' . $i] && $_FILES['uploadFile' . $i]['size'] > 0 && $i<100 ; $i++){
  try{
    //do your upload stuff here
  }catch(e){}
}

[编辑] 要修改您的页面以包含动态数量的字段,请执行以下操作:

看看这个小提琴:http://jsfiddle.net/RjcHY/2/

单击右侧的加号和减号按钮以查看其工作原理。我做了它,以便根据你的php的期望命名文件按钮。

答案 1 :(得分:0)

在处理文件上传等常见任务时,请编写一些库来处理这些任务,并在需要时调用必要的功能。如果创建上传器类文件,则只需调用您创建的一种方法来处理文件上载。

在这里,我将为您提供一个上传者课程

<?php

//Save file as Uploader.php
//File Uploading Class

class Uploader
{
private $destinationPath;
private $errorMessage;
private $extensions;
private $allowAll;
private $maxSize;
private $uploadName;
private $seqnence;
public $name='Uploader';
public $useTable =false;

function setDir($path){
$this->destinationPath = $path;
$this->allowAll = false;
}

function allowAllFormats(){
$this->allowAll = true;
}

function setMaxSize($sizeMB){
$this->maxSize = $sizeMB * (1024*1024);
}

function setExtensions($options){
$this->extensions = $options;
}

function setSameFileName(){
$this->sameFileName = true;
$this->sameName = true;
}
function getExtension($string){
$ext = "";
try{
$parts = explode(".",$string);
$ext = strtolower($parts[count($parts)-1]);
}catch(Exception $c){
$ext = "";
}
return $ext;
}

function setMessage($message){
$this->errorMessage = $message;
}

function getMessage(){
return $this->errorMessage;
}

function getUploadName(){
return $this->uploadName;
}
function setSequence($seq){
$this->imageSeq = $seq;
}

function getRandom(){
return strtotime(date('Y-m-d H:iConfused')).rand(1111,9999).rand(11,99).rand(111,999);
}
function sameName($true){
$this->sameName = $true;
}
function uploadFile($fileBrowse){
$result = false;
$size = $_FILES[$fileBrowse]["size"];
$name = $_FILES[$fileBrowse]["name"];
$ext = $this->getExtension($name);
if(!is_dir($this->destinationPath)){
$this->setMessage("Destination folder is not a directory ");
}else if(!is_writable($this->destinationPath)){
$this->setMessage("Destination is not writable !");
}else if(empty($name)){
$this->setMessage("File not selected ");
}else if($size>$this->maxSize){
$this->setMessage("Too large file !");
}else if($this->allowAll || (!$this->allowAll && in_array($ext,$this->extensions))){

if($this->sameName==false){
$this->uploadName = $this->imageSeq."-".substr(md5(rand(1111,9999)),0,8).$this->getRandom().rand(1111,1000).rand(99,9999).".".$ext;
}else{
$this->uploadName= $name;
}
if(move_uploaded_file($_FILES[$fileBrowse]["tmp_name"],$this->destinationPath.$this->uploadName)){
$result = true;
}else{
$this->setMessage("Upload failed , try later !");
}
}else{
$this->setMessage("Invalid file format !");
}
return $result;
}

function deleteUploaded(){
unlink($this->destinationPath.$this->uploadName);
}

}

?>

使用Uploader.php

<?php

$uploader = new Uploader();
$uploader->setDir('uploads/images/');
$uploader->setExtensions(array('jpg','jpeg','png','gif')); //allowed extensions list//
$uploader->setMaxSize(.5); //set max file size to be allowed in MB//

if($uploader->uploadFile('txtFile')){ //txtFile is the filebrowse element name //
$image = $uploader->getUploadName(); //get uploaded file name, renames on upload//

}else{//upload failed
$uploader->getMessage(); //get upload error message
}


?> 

用于处理多个上传,前3个图片上传 按如下方式重复该块

<?php

for($i=1;$i<=3;$i++){

    $uploader->setExtensions(array('jpg','jpeg','png','gif')); //allowed extensions list//
    $uploader->setMaxSize(.5); //set max file size to be allowed in MB//
    $uploader->setSequence($i);
    if($uploader->uploadFile('txtFile'.$i)){ //txtFile is the filebrowse element name //
       $image = $uploader->getUploadName(); //get uploaded file name, renames on upload//

    }else{//upload failed
     $uploader->getMessage(); //get upload error message
    }

}

?>

在上面的例子中,文件浏览组件被命名为txtFile1,txtFile2,txtFile3 希望你能理解我的解释。