Seite 1 von 2

Upload-/Download-Modul für's Frontend

Verfasst: Mi 5. Okt 2005, 13:44
von om
Nachdem schon öfters mal die Anfrage nach einem Upload-Modul für's Frontend aufkam und ich selbiges für ein aktuelles Projekt erstellt habe, hier mal der Code. Das Upload-Modul sollte aber in einen geschützten Bereich gestellt werden, oder wer will schon, dass jederman(n) was auf seine HP hochladen kann :wink:

INPUT:

Code: Alles auswählen

?>

<table cellspacing="0" cellpadding="0" cellpadding="4"> 

    <tr> 
        <td style="font-size:11px">Upload-Verzeichnis:</td> 
        <td> 
            <select name="CMS_VAR[0]"> 
            <option value="0"></option> 
            <?php 

                $sql = "SELECT DISTINCT dirname from ".$cfg["tab"]["upl"]; 

                $db->query($sql); 

                while ( $db->next_record() ) { 

$upload_dir=substr_replace($db->f("dirname"),'',(strlen($db->f("dirname"))-1)); 

                    if ( "CMS_VALUE[0]" == $upload_dir) { 
                        echo '<option selected="selected" value="'.$upload_dir.'">'.$db->f("dirname").'</option>'; 

                    } else { 
                        echo '<option value="'.$upload_dir.'">'.$db->f("dirname").'</option>'; 

                    } 
                } 

            ?> 
            </select> 
        </td> 
    </tr> 
    <tr> 
        <td style="font-size:11px">Datei-Typ(en):</td> 
        <td><input type="text" name="CMS_VAR[1]" value="CMS_VALUE[1]"></td> 
    </tr> 
    <tr> 
        <td style="font-size:11px" colspan ="2">Erlaubte Datei-Typ(en) mit einem | trennen. Bsp.: gif|jpg|pdf</td> 
    </tr> 
    <tr> 
        <td style="font-size:11px">maximale Größe:</td> 
        <td><input type="text" name="CMS_VAR[2]" value="CMS_VALUE[2]"> KB</td> 
    </tr> 
    <tr> 
        <td style="font-size:11px" colspan ="2">1000 KB entsprechen 1 MB</td> 
    </tr> 

</table> 

<?php
OUTPUT:

Code: Alles auswählen

<?php

   cInclude('includes', 'functions.upl.php');

   // Absoluter Pfad zum Ordner in den die Datei hochgeladen werden soll.
   $pfad = "upload/CMS_VALUE[0]";

   // Ist eine maximale Größe der Datei festgelegt worden ?
   if ("CMS_VALUE[2]" == "") {
      $sizeabfrage = "no";
   }
   else {
      $sizeabfrage = "yes";
   }

   // Maximale Größe der Datei (Falls $sizeabfrage = "yes" ist)
   $filesize = "CMS_VALUE[2]"*1.024*1024;

   // Wird die maximale Größe auch angezeigt ?
   if ("CMS_VALUE[2]" == "") {
      $sizeanzeige = "no";
   }
   else {
      $sizeanzeige = "yes";
   }

   // Was für Dateitypen sollen erlaubt sein ?
   $extend = "CMS_VALUE[1]";

   // Sollen die erlaubten Dateitypen angezeigt werden ?
   $extendanzeige = "yes";


   $fehler = FALSE;

   if ($senden) {
      if ($file_name == "") {
         $desc = $Beschreibung;
         echo "<font color=#FF0000><b>Es wurde keine Datei ausgewählt!</b></font>";
         $fehler = TRUE;
      }

      if (!$fehler)
      if (file_exists("$pfad/$file_name")) {
         $desc = $Beschreibung;
         echo "<font color=#FF0000><b>Dateiname schon vorhanden!</b></font>";
         $fehler = TRUE;
      }

      if (!$fehler)
      if ($sizeabfrage == "yes") {
         if ($file_size > $filesize) {
            $desc = $Beschreibung;
            echo "<font color=#FF0000><b>Die Datei ist zu groß!</b></font>";
            $fehler = TRUE;
         }
      }

      if (!$fehler)
      if (!eregi("($extend)$", $file_name)) {
         $desc = $Beschreibung;
         echo "<font color=#FF0000><b>Dieser Dateityp ist nicht erlaubt!</b></font>";
         $fehler = TRUE;
      }

      if (!$fehler) {
         if (copy($file, $pfad."/".$file_name)) {
            uplSyncDirectory("CMS_VALUE[0]"."/");
            $db = new DB_Contenido;
            $sql = 'SELECT * FROM `con_upl` WHERE `filename` = "'.$file_name.'" LIMIT 0, 30'; 
            $db->query($sql); 
            $db->next_record();
            $ID = $db->f('idupl');
            $sql = 'UPDATE `con_upl` SET `description` = "'.$Beschreibung.'" WHERE `idupl` = "'.$ID.'"';
            $db->query($sql);
            echo "<font color=#00FF00><b>Datei hochgeladen</b></font><BR>";
            $fehler = FALSE;
         }
         else {
            echo "<font color=#FF0000><b>Datei nicht hochgeladen</b></font>";
            $desc = $Beschreibung;
            $fehler = TRUE;
         }

      }
   }

   if ($fehler || !$senden) {

?>

<table>

<form action="<?php $PHP_SELF; ?>" method="post" enctype="multipart/form-data">
<BR>
<b>Bitte Datei auswählen:</b>
<BR>
<?php
   if ($sizeanzeige == "yes") {
      echo ("Maximale Größe: ".($filesize/1024/1024)." MB");
   }
?>
<BR>
<?php
   if ($extendanzeige == "yes") {
      echo ("Erlaubte Dateitypen: ".str_replace("|",", ",$extend));
   }
?>
<BR><BR>
<input type="file" size="40" name="file">
<BR>
<b>Beschreibung</b> (optional):<br>
<textarea name="Beschreibung" wrap="virtual" rows="5" cols="60" maxlength="10"><?php echo $desc; ?></textarea>
<BR><BR>
<input type="Submit" name="senden" value="Hochladen"><br>
</form>
</table>

<?php
}
?>
Upload-Verzeichnis, Datei-Typ und die Größe der Datei sind konfigurierbar. Außerdem kann eine Beschreibung zur Datei mitgespeichert werden.

Hier noch der Code für eine zugehörige Downloadliste mit MouseOver-Effekt auf den Tabellen-Zeilen und ein- und ausblendbarer Beschreibung zum jeweiligen Download.

INPUT:

Code: Alles auswählen

?> 
<table cellspacing="0" cellpadding="0" cellpadding="4"> 

    <tr> 
        <td style="font-size:11px">Download-Verzeichnis:</td> 
        <td> 
            <select name="CMS_VAR[0]"> 
            <option value="0"></option> 
            <?php 

                $sql = "SELECT DISTINCT dirname from ".$cfg["tab"]["upl"]; 

                $db->query($sql); 

                while ( $db->next_record() ) { 

$upload_dir=substr_replace($db->f("dirname"),'',(strlen($db->f("dirname"))-1)); 

                    if ( "CMS_VALUE[0]" == $upload_dir) { 
                        echo '<option selected="selected" value="'.$upload_dir.'">'.$db->f("dirname").'</option>'; 

                    } else { 
                        echo '<option value="'.$upload_dir.'">'.$db->f("dirname").'</option>'; 

                    } 
                } 

            ?> 
            </select> 
        </td> 
    </tr> 
    <tr> 
        <td style="font-size:11px">Datei-Typ:</td> 
        <td> 
            <select name="CMS_VAR[1]"> 
            <option value="0"></option> 
            <?php 

                $sql = "SELECT DISTINCT filetype from ".$cfg["tab"]["upl"]; //." WHERE dirname='CMS_VALUE[0]/'"; 

                $db->query($sql); 
                while ( $db->next_record() ) { 

                $upload_file=$db->f("filetype"); 

                    if ( "CMS_VALUE[1]" == $upload_file) { 
                        echo '<option selected="selected" value="'.$upload_file.'">'.$db->f("filetype").'</option>'; 

                    } else { 
                        echo '<option value="'.$upload_file.'">'.$db->f("filetype").'</option>'; 

                    } 
                } 


            ?> 
            </select> 
        </td> 
    </tr> 

</table> 

<?php 
OUTPUT:

Code: Alles auswählen

<?php
//Download-Verzeichnis wird synchronisiert
cInclude('includes', 'functions.upl.php');
uplSyncDirectory("CMS_VALUE[0]"."/");
?>

<script language="javascript">
<!--
function setFrame(theRow,thePointerColor,theBackgroundColor,cells)
{
  if (!cells) cells=0;
  if (thePointerColor == '' || typeof(theRow.style) == 'undefined') return false;

  if (typeof(document.getElementsByTagName) != 'undefined') {
    var theCells = theRow.getElementsByTagName('td');
  } else if (typeof(theRow.cells) != 'undefined') {
    var theCells = theRow.cells;
  } else {
    return false;
  }

  var rowCellsCnt  = theCells.length;
  var number       = rowCellsCnt-cells;
  for (var c = 0; c < number; c++) {
    if (c==0)           theCells[c].style.borderLeft = "solid";
    if (c==(number-1))  theCells[c].style.borderRight = "solid";
    theCells[c].style.borderTop    = "solid";
    theCells[c].style.borderBottom = "solid";
    theCells[c].style.borderWidth  = "1px";
    theCells[c].style.backgroundColor  = theBackgroundColor;
    theCells[c].style.borderColor  = thePointerColor;
    <!--theCells[c].style.cursor  = "pointer";-->
  }
  return true;
}
// -->
</script>

<script type="text/javascript">
function show (ID) {
  var test;
  test = document.form.hidden.value;
  if (document.getElementById) {
  if (document.getElementById(ID).style.visibility == "hidden") {
    document.getElementById(ID).style.visibility = "visible";
    document.getElementById(ID).style.position = "relative";
    }
  else {
    document.getElementById(ID).style.visibility = "hidden";
    document.getElementById(ID).style.position = "absolute";
    }
  }
  if (test != "") {
  if (test != ID) {
  if (document.getElementById(test).style.visibility == "visible") {
    document.getElementById(test).style.visibility = "hidden";
    document.getElementById(test).style.position = "absolute";
    }
  }
  }
  document.form.hidden.value = ID;
}
</script>


<?php 
//Datenbankanfrage wird definiert (was, wo und wie sortiert) 
$sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE dirname ='CMS_VALUE[0]/' order by filetype,filename asc"; 

//Verbindung zur Datenbank wird hergestellt 
$db->query($sql); 

//Zeigt die Datensätze in der Tabelle an 
echo '<span class="filecount">Insgesamt stehen ' . $db ->num_rows() . ' Dokumente zur Verfügung:</span><br>'; 

//Link zur Datei im Upload-Verzeichnis 
$href = $cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"]; 
$i = 1; 

//Die Datensätze werden in einer Aufzählungsliste widergegeben, die sich über die CSS-Klasse 'ul.download' gestaltem lässt 
echo "<table width=\"480\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">"; 
echo "
  <tr>
    <td colspan=\"3\">&nbsp;</td>
  </tr>
";
while ($db->next_record()) 
{ 
$dateityp = $db->f("filetype"); 
echo " 
  <tr onmouseover=\"setFrame(this, '#CCCCCC', '#EFEFEF')\" onmouseout=\"setFrame(this, '#FFFFFF', '#FFFFFF')\"> 
    <td style=\"border-top:solid 1px #FFFFFF;border-bottom:solid 1px #FFFFFF;border-left:solid 1px #FFFFFF;cursor:pointer;\" width=\"20\" valign=\"top\" onClick=\"javascript:show('".$db->f("idupl")."')\"><img src=\"".$cfgClient[$client]['htmlpath']['frontend']."images/filetypes/".$dateityp.".gif\"></td> 
    <td style=\"border-top:solid 1px #FFFFFF;border-bottom:solid 1px #FFFFFF;cursor:pointer;\" width=\"380\" valign=\"top\" onClick=\"javascript:show('".$db->f("idupl")."')\"><a title=\"download ".$db->f("filename")."\" target=\"_blank\" href=\"".$href.$db->f("dirname").$db->f("filename")."\" onClick=\"this.blur()\">".$db->f("filename")."</a><div id=\"".$db->f("idupl")."\" style=\"position:absolute; visibility:hidden\">Beschreibung: ";
if ($db->f("description") != "") {
   echo $db->f("description");
   }
else {
   echo "keine Beschreibung vorhanden";
   }
echo "</div></td> 
    <td style=\"border-top:solid 1px #FFFFFF;border-bottom:solid 1px #FFFFFF;border-right:solid 1px #FFFFFF;cursor:pointer;\" width=\"80\" valign=\"top\" align=\"right\" onClick=\"javascript:show('".$db->f("idupl")."')\"><span class=\"fileattrib\"> [".round($db->f("size")/1024,1)." KB]</span></td> 
  </tr> 
"; 
$i++; 
} 
echo "</table>"; 
echo '<br><br>Um eine Datei herunterzuladen, klicken Sie bitte mit der rechten Maustaste auf den entsprechenden Dateinamen und wählen Sie im Kontextmenü "Ziel speichern unter..." aus.';
echo "<form name=\"form\" action=\"\"><input type=\"hidden\" id=\"hidden\" name=\"hidden\" value=\"\"></form>";

?> 
Download-Verzeichnis und Datei-Typ sind konfigurierbar.
Evtl. muss das Verzeichnis contenido/images/filetypes/ nach cms/images/ kopiert oder entsprechend der Code angepasst werden.

Bemerkung: Ich habe das ganze bisher nur auf einem lokalen System getestet. Der Code ist vielleicht stellenweise etwas spartanisch, funktioniert aber einwandfrei. Contenido-Version 4.5.2

Viel Spaß damit.

Verfasst: Sa 22. Okt 2005, 13:46
von JSommer
klingt nett, kann man das schon irgendwo online mal angucken :) ?!

Verfasst: Mo 24. Okt 2005, 08:59
von om
Download-Modul ist online:
http://www.tv-frittlingen.de/cms/front_ ... p?idcat=19
Upload ist natürlich nicht öffentlich :wink:

Verfasst: Do 27. Okt 2005, 16:00
von halousi
ganz große klasse.... viiiiiielen dank!!!

Verfasst: Do 4. Okt 2007, 11:03
von Moudi
Bei mir hat alles soweit geklappt, Sieht nach einem tollen Modul aus. Aber irgendwie schaff ich's nicht, eine Datei hochzuladen... Hat mir jemand einen Tipp?

Muss ich irgendwo noch etwas hinterlegen? Zugangsdaten FTP?

Wäre ja im folgenden Block...
if (!$fehler) {
if (copy($file, $pfad."/".$file_name)) {
uplSyncDirectory("CMS_VALUE[0]"."/");
$db = new DB_Contenido;
$sql = 'SELECT * FROM `con_upl` WHERE `filename` = "'.$file_name.'" LIMIT 0, 30';
$db->query($sql);
$db->next_record();
$ID = $db->f('idupl');
$sql = 'UPDATE `con_upl` SET `description` = "'.$Beschreibung.'" WHERE `idupl` = "'.$ID.'"';
$db->query($sql);
echo "<font color=#00FF00><b>Datei hochgeladen</b></font><BR>";
$fehler = FALSE;
}
else {
echo "<font color=#FF0000><b>Datei nicht hochgeladen</b></font>";
$desc = $Beschreibung;
$fehler = TRUE;
}

Verfasst: Do 4. Okt 2007, 15:43
von HerrB
Die Dateien werden via http-Upload hochgeladen und relativ im upload-Verzeichnis gespeichert.

Das upload-Verzeichnis muss also so berechtigt sein, dass (auch in Contenido) Dateien hochgeladen werden können (siehe Content -> Dateiverwaltung).

Ansonsten gebe noch mehr Details, "geht nicht" ist noch zu wenig.

Gruß
HerrB

Verfasst: Do 4. Okt 2007, 16:31
von Moudi
Die Rechte stimmen, upload über Contenido ist möglich. Die Testdatei umfasst ca. 50kb, in Contenido ist sie uploadable, über das frontend nicht.

Es kommt keine Contenido-Fehlermeldung, nur die im Modul programmierte Fehlermeldung «Datei nicht hochgeladen», der Datei-Pfad ist gelöscht, die Besschreibung ist noch da.

So nehme ich an, dass der Hinweis auf den Fehler im vorher geposteten Codeblock zu suchen ist. Da ich php nicht beherrsche, wird das jetzt schwierig.

Im erwähnten Code-Block, ist von einer Datenbank die Rede. Ich kann mir vorstellen, dass ich da etwas nicht gemacht habe, da ich php nicht verstehe und nicht sehe, was hier gemacht wird und was vorhanden sein sollte. Wird da die Contenido-Datenbank verwendet oder sollte eine neue Datenbank angelegt werden?

Hilft dir das weiter?

Verfasst: Fr 5. Okt 2007, 14:41
von Moudi
Ich arbeite mit der Contenido Version 4.6.15

Ich habe beide Module, also das Modul für den Upload und das Modul für den Download Copy-Paste-like bei mir erstellt, entsprechende Templates erstellt und die Rechte der betroffenen Verzeichnisse entsprechend gesetzt.

Über die Dateiverwaltung können Dateien in dieses Verzeichnis upgeloadet werden, das habe ich getestet.

So wie ich das jetzt sehe, wird die DB verwendet, die für Contenido angelegt wurde. Die entsprechende Tabelle «con_upl» besteht...

Kann ich den Mudul-Code wirklich nur copy-pasten oder muss ich noch irgendetwas anpassen?

Verfasst: Mo 8. Okt 2007, 23:47
von HerrB
Was gibt ein

Code: Alles auswählen

echo $pfad;
direkt unter

Code: Alles auswählen

$pfad = "upload/CMS_VALUE[0]"; 

aus?

Gruß
HerrB

Verfasst: Di 9. Okt 2007, 16:15
von Moudi
Sollte ich das im Quelltext des Frontends suchen? Oder wo? :oops:

Verfasst: Di 9. Okt 2007, 17:18
von HerrB
Code in der Modul-Ausgabe des ... öhm ... ersten? Moduls.

Gruß
HerrB

Verfasst: Mi 10. Okt 2007, 08:59
von Moudi
OK, sorry, jetzt weiss ich auch, was du gemeint hast... Wenn ich's jetzt richtig geschnallt habe, sollte ich ein

Code: Alles auswählen

 echo $pfad; 
in die Ausgabe des Upload-Moduls einsetzen, um zu kontrollieren, welchen Pfad das Mudul ausgibt.

Ich erhalte den richtigen Pfad... «upload/ab/xy»

Greez
moudi

Verfasst: Mi 10. Okt 2007, 10:14
von HerrB
Da kommt im Modul ein

Code: Alles auswählen

if (copy($file, $pfad."/".$file_name))  {
vor.

Ersetze das mal mit

Code: Alles auswählen

if (move_uploaded_file($_FILES['file']['tmp_name'][0], $cfgClient[$client]["path"]["frontend"].$pfad."/".$file_name)) {
Gruß
HerrB

Verfasst: Mi 10. Okt 2007, 13:57
von Moudi
Unverändert...

Verfasst: Do 11. Okt 2007, 15:22
von Moudi
Ich habe noch ein anderes Upload-Modul getestet, das von «tommo»

http://contenido.org/forum/viewtopic.ph ... ploadmodul

Das funzt auch nicht. Ist es möglich, dass Sicherheitseinstellungen meines Providers einen Upload verhindern können?