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

om
Beiträge: 21
Registriert: Fr 18. Feb 2005, 15:30
Kontaktdaten:

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

Beitrag von om » Mi 5. Okt 2005, 13:44

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.

JSommer
Beiträge: 324
Registriert: Fr 5. Sep 2003, 12:32
Wohnort: 192.168.0.11
Kontaktdaten:

Beitrag von JSommer » Sa 22. Okt 2005, 13:46

klingt nett, kann man das schon irgendwo online mal angucken :) ?!

om
Beiträge: 21
Registriert: Fr 18. Feb 2005, 15:30
Kontaktdaten:

Beitrag von om » Mo 24. Okt 2005, 08:59

Download-Modul ist online:
http://www.tv-frittlingen.de/cms/front_ ... p?idcat=19
Upload ist natürlich nicht öffentlich :wink:

halousi
Beiträge: 111
Registriert: Mi 30. Mär 2005, 15:31
Kontaktdaten:

Beitrag von halousi » Do 27. Okt 2005, 16:00

ganz große klasse.... viiiiiielen dank!!!

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Do 4. Okt 2007, 11:03

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

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Do 4. Okt 2007, 15:43

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
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Do 4. Okt 2007, 16:31

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?

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Fr 5. Okt 2007, 14:41

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?

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mo 8. Okt 2007, 23:47

Was gibt ein

Code: Alles auswählen

echo $pfad;
direkt unter

Code: Alles auswählen

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

aus?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Di 9. Okt 2007, 16:15

Sollte ich das im Quelltext des Frontends suchen? Oder wo? :oops:

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 9. Okt 2007, 17:18

Code in der Modul-Ausgabe des ... öhm ... ersten? Moduls.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Mi 10. Okt 2007, 08:59

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

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 10. Okt 2007, 10:14

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
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Mi 10. Okt 2007, 13:57

Unverändert...

Moudi
Beiträge: 23
Registriert: Fr 13. Jan 2006, 08:26
Wohnort: Sumiswald, Schweiz
Kontaktdaten:

Beitrag von Moudi » Do 11. Okt 2007, 15:22

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?

Gesperrt