2012-02-07 2 views
-2

В настоящее время у меня есть этот скрипт, где пользователи (используя форму, где они могут загружать до семи изображений) могут загружать несколько изображений в папку и имя изображения в мою базу данных, без каких-либо успехов. Пожалуйста помоги.Множественная загрузка файла с помощью цикла

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>"; 
    } 
} 
} 

} 
+3

Хорошее место для начала - объяснить проблему. Сообщения об ошибках? Что не работает? – Steve

+0

Извините, что он отлично работает, если я загружаю все семь файлов, но как только я решаю только загрузить один или два файла, я получаю сообщение $ message, указывающее, что файл не был выбран – user1002749

ответ

0

Здесь может быть что-то не так. Вы пытались разбить это на части? Вы уверены, что DB подключается? Вы уверены, что у php есть доступ к записи в каталоги, к которым он пытается писать? Вы уверены, что эти каталоги существуют ... и т. Д. и т. д.

Прокомментируйте подавляющую часть кода и начните тестировать все компоненты по частям или оберните материал в try/catch и посмотрите, какие ошибки производятся.

Если проблема возникает только при загрузке < 7 файлов, тогда проблема в том, что вы закодировали 7 в свой цикл!

Процитировать, сколько файлов фактически загружается, а не фиксированное число.

Предполагая, что все они названы последовательно (и начиная с 0), вы можете проверить наличие своего хэшированного значения FILE в цикле и просто продолжать глотать до тех пор, пока оно не достигнет нулевого значения (возможно, полезно добавить ограничитель, чтобы сделать что он не может продолжаться вечно)

что-то вроде этого ...

[править 2] модифицировали условие, чтобы включить тест на размер файла

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

[EDIT] для изменить свою страницу, чтобы включить динамическое число г полей сделать это:

проверить эту скрипку: http://jsfiddle.net/RjcHY/2/

Нажмите на плюс и минус кнопки на правой стороне, чтобы увидеть, как это работает. Я сделал так, что он называет кнопки файлов в соответствии с ожиданиями вашего php.

+0

Dr.Dredel, да, моя база данных подключена хорошо, я отредактировал код и поместил весь скрипт, чтобы вы могли видеть, что я сделал, как я сказал, чтобы он работал отлично, когда я загружаю все семь изображений, но когда я решаю только загрузить два или три, мое сообщение $ отображается, что файлы не были выбраны. – user1002749

+0

отредактирован для вашего дополнительного удовольствия :) –

+0

Ха-ха, спасибо, но если я зацикливаюсь до 100, то у меня должно быть 100 полей для загрузки файлов ?. Я попробовал свой код просто изменить 100 на 6, чтобы разместить только 7 полей для загрузки файлов в моей форме, это работает, но снова я сижу с проблемой, я должен заполнить все поля для загрузки, иначе я получаю сообщение «Недопустимый файл или не выбран файл ", возможно, для каждого цикла, но не знаете, как реализовать код. – user1002749

0

При работе с общими задачами, такими как загрузка файлов, напишите библиотеку для обработки этих задач и вызовите необходимую функцию везде, где это необходимо. Если вы создаете файл класса загрузчика, вы можете просто вызвать один из методов, которые вы создали для обработки загрузки файлов.

Здесь я дам вам Uploader класса

<?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, txtFil e2, txtFile3 Надеюсь, вы поймете мои объяснения.

+0

Спасибо Киран собирается попробовать сейчас, когда я использую ваш код, как я буду отправлять данные в базу данных при загрузке изображения – user1002749

+0

$ image = $ uploader-> getUploadName(); эта строка дает вам имя загруженного файла. т.е. $ image. Вы можете использовать эту переменную в запросе mysql (insert). или сохранить все имена загруженных файлов в массиве, например $ images [] = $ uploader-> getUploadName(); цикл через массив и выполнить запрос на вставку – Kiran

+0

Привет, Киран, попробовал ваш код, но не получился, я не уверен, что делать с вашим кодом, извините, что я действительно новичок, я сохранил файл как uploader.php (отдельный файл) и поставил код, который находится под вашим комментарием «Для обработки нескольких загрузок загрузка ex 3 изображений повторяет блок следующим образом ....» на моей исходной странице и добавить include (uploader.php), но я получаю ошибку, что $ uploader не определен? ?? – user1002749