Несколько загрузок файлов с циклом - PullRequest
0 голосов
/ 07 февраля 2012

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

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 голосов
/ 07 февраля 2012

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

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

0 голосов
/ 07 февраля 2012

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

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

[править] Если проблема возникает только тогда, когда вы загружаете <7 файлов, проблема заключается в том, что вы жестко запрограммировали 7 в свой цикл! </p>

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

Предполагая, что все они именуются последовательно (и начиная с 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.

...