Checkbox
willy96
- html
Hallo
Ich habe eine hoffentlich kleine Frage zu Checkboxen.
Und zwar würde ich gerne einen Ordner Auslesen und die enthaltenen Dateien als Auswahlfeld oder Checkboxen ausgeben lassen. Sprich alle Dateien in dem Ordner sollen als Checkboxen oder in einem Auswahlfeld erscheinen und man soll eine oder mehrere auswählen können.
Dies soll möglichst Dynamisch sein also wenn man eine Datei löscht oder einen Anderen Ordner ausliest dennoch die richtigen Ergebnisse bekommt.
Gedacht ist das alles für einen Webserver (apache) dass man nach dem Upload auch die Möglichkeit hat die Dateien in dem Enthaltenen Ordner wieder zu löschen.
Vielen Dank schonmal :)
Gruß willy96
Hello Willi,
Ich habe eine hoffentlich kleine Frage zu Checkboxen.
Und zwar würde ich gerne einen Ordner Auslesen und die enthaltenen Dateien als Auswahlfeld oder Checkboxen ausgeben lassen. Sprich alle Dateien in dem Ordner sollen als Checkboxen oder in einem Auswahlfeld erscheinen und man soll eine oder mehrere auswählen können.
Dies soll möglichst Dynamisch sein also wenn man eine Datei löscht oder einen Anderen Ordner ausliest dennoch die richtigen Ergebnisse bekommt.Gedacht ist das alles für einen Webserver (apache) dass man nach dem Upload auch die Möglichkeit hat die Dateien in dem Enthaltenen Ordner wieder zu löschen.
Dafür benötigst Du serverseitig eine aktive Lösung, also z.B. ein Script in PHP, Perl, ...
Und dann solltest Du dieses Vorhaben auf jeden Fall mit einer Session umsetzen, sodass Du die Möglichkeit zu einer "Vorwärts-Rückwärts"-Absicherung hast, also die Dateinamen übersetzen lassen kannst.
Beispiel:
Beim Request auf die Ressource (z.B. das PHP-Script) liest dies die Dateinamen im
gewünschtren Pfad aus und trägt Pfad und Dateinamen in ein Array in der Session ein.
Der Index des Arrays und der Dateiname werden dann ins Formular geschrieben, dass
du dem Client sendest. Wenn der Client nun eine Checkbox auswählt und wieder einen
Request auslöst, werden die Indexe (und ggf. auch die Dateinamen) wieder an die
Ressource gesendet. Nur, wenn der Index (und der Dateiname) auch im Array vorhanden
sind, darf die Datei gelöscht werden.
Noch eine Stufe mehr wäre es, den Index auch noch als Unique-Zufallszahl zu gestalten.
Wenn Du nur den Dateinamen benutzen würdest ohne vorher das Kontrollarray zu schreiben, könnte der Client jede beliebige Datei (ggf. auch in anderen Pfaden) als Löschauftrag bestimmen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Habe das Ganze jetzt mithilfe eines PHP Scriptes was ich gefunden habe gelöst allerdings löscht er die Dateien nicht richtig. Kann mir jemand sagen was ich falsche gemacht habe? Vielen Dank :)
Das Script:
<html>
<TITLE>DIR</TITLE>
<BODY>
<?php
/* **************************************************************
dir.php3
A script to manage files on your web
Questions, comments, bug reports to : yannickf@yahoo.com
SourceForge project phpFileManager:
http://sourceforge.net/project/?group_id=1640
**************************************************************
History
Version 0.1
first release
Version 0.2 Feb 21 2000
bug correction
Version 0.3 Feb 22 2000
change sort algo
add icons before files
set display for atime, ctime, utime
**************************************************************
*/
function cmp( $a, $b )
{
GLOBAL $sort;
if( $a->inode == $b->inode )
return 0;
switch( $sort )
{
case "size":
return ($a->size > $b->size) ? -1 : 1;
case "type":
return strcmp($a->type, $b->type);
case "view":
return strcmp($a->view, $b->view);
case "atime":
return ($a->atime > $b->atime) ? -1 : 1;
case "ctime":
return ($a->ctime > $b->ctime) ? -1 : 1;
case "mtime":
return ($a->mtime > $b->mtime) ? -1 : 1;
case "group":
return strcmp($a->group, $b->group);
case "inode":
return ($a->inode > $b->inode) ? -1 : 1;
case "owner":
return strcmp($a->owner, $b->owner);
case "perms":
return ($a->perms > $b->perms) ? -1 : 1;
case "ext":
return strcmp($a->ext, $b->ext);
case "name":
default:
return 1;
}
}
function getIcons( $ext )
{
switch( $ext )
{
case "dir":
$file = "dir";
break;
case "link":
$file = "link";
break;
case "zip":
case "tgz":
case "gz":
case "Z":
$file = "compressed";
break;
case "gif":
case "jpg":
$file = "image2";
break;
case "dvi":
$file = "dvi";
break;
case "":
case "exe":
$file = "binary";
break;
case "sh":
case "php":
case "php3":
case "sql":
case "inc":
case "js":
$file = "script";
break;
case "txt":
$file = "text";
break;
case "html":
case "shtml":
case "phtml":
$file = "world1";
break;
default:
$file = "generic";
break;
}
return $IMG="<IMG SRC='icons/".$file.".gif'>";
}
class MyFile {
var $name;
var $path;
var $type;
var $ext;
var $stype;
var $sfile;
var $size;
var $file;
var $atime;
var $ctime;
var $mtime;
var $group;
var $inode;
var $owner;
var $perms;
function set( $filename, $path )
{
GLOBAL $cd;
$this->name = $filename;
$this->path = $path ;
$this->file = $this->path."/".$this->name;
$this->type = filetype( $this->file );
$this->size = filesize( $this->file );
$this->atime = fileatime( $this->file );
$this->ctime = filectime( $this->file );
$this->mtime = filemtime( $this->file );
$this->group = filegroup( $this->file );
$this->inode = fileinode( $this->file );
$this->owner = fileowner( $this->file );
$this->perms = fileperms( $this->file );
switch( $this->type )
{
case "link":
$this->sfile = readlink( $this->file );
$this->stype = filetype( $this->sfile );
$this->ext = "link";
break;
case "file":
$list = explode( ".", $this->name );
$nb = sizeof( $list );
if( $nb > 0 )
$this->stype = $list[$nb-1];
else
$this->stype = "???";
$this->ext = $this->stype;
switch( $this->stype )
{
case "gif":
case "GIF":
case "jpg":
case "JPG":
if( isset( $cd ) )
$pwd = $cd."/";
else
$pwd = "";
$this->sfile = "<IMG SRC='".$this->file."'>";
break;
default:
$this->sfile = $this->stype;
break;
}
break;
default:
$this->stype = "";
$this->sfile = "";
$this->ext = $this->type;
break;
}
}
function formatSize()
{
return number_format( $this->size, 0, ".", " ");
}
}
function genUrl( $ref, $args, $key = "", $val = "" )
{
$valist = "";
reset( $args );
if( $key != "" )
$args[ "$key" ] = $val;
if( !is_array( $args ) )
return $ref;
while( list( $key, $val ) = each( $args ) )
{
if( $val == "" )
continue;
if( $valist == "" )
$valist .= "?";
else
$valist .= "&";
$valist .= $key."=".$val;
}
return $ref.$valist;
}
function updir( $path )
{
$last = strrchr( $path, "/" );
$n1 = strlen( $last );
$n2 = strlen( $path );
return substr( $path, 0, $n2-$n1 );
}
$ref = "dir.php3";
if( isset( $cd ) )
{
$path = $cd;
//$lcd = "?cd=$cd'";
$args[ "cd" ] = $cd;
}
else
{
$path = ".";
//$lcd = "";
$args[ "cd" ] = "";
}
if( isset( $nb ) )
{
for( $i = 0; $i < $nb; $i++ )
{
$var = "id_$i";
if( isset( $$var ) )
{
$file = $path."/".$$var;
if( is_file( $file ) || is_link( $file ) )
{
if( unlink( $file ) )
echo "<BR><b>$file</b> deleted\n";
else
echo "<BR>unable to delete <b>$file</b>\n";
}
elseif( is_dir( $file ) )
{
if( rmdir( $file ) )
echo "<BR><b>$file</b> deleted\n";
else
echo "<BR>unable to delete <b>$file</b>\n";
}
}
}
}
$step = 100;
if( !isset( $sort ) )
$sort = "name";
else
$args[ "sort" ] = $sort;
if( !isset( $from ) )
$from = 0;
else
$args[ "from" ] = $from;
if( !isset( $to ) )
$to = $from + $step;
$d = dir($path);
echo "\n";
echo "<br><a href=$ref >Home</a>\n";
$updir = updir($d->path);
if( $updir != "." )
echo "<br>Up dir; <a href=$ref?cd=$updir>$updir</a>\n";
echo "<br>cd: <a href=$ref?cd=".$d->path."/..>..</a>\n";
echo "<br>Chemin: <b>".$d->path."</b>\n";
$n = 0;
while( $entry=$d->read() )
{
$lFiles[ $n ] = new MyFile;
$lFiles[ $n ]->set( $entry, $path );
$n++;
}
$d->close();
echo "<FORM NAME='del' METHOD='post' ACTION='".genUrl( $ref, $args )."'>\n";
echo "<TABLE BORDER=1>\n";
echo "<TR>\n";
echo "<TH>D</TH>\n";
// echo "<TH><a href='".genUrl( $ref, $args, "sort", "type" )."'>Type</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "name" )."'>Name</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "size" )."'>Size</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "ext" )."'>ext</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "atime" )."'>atime</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "ctime" )."'>ctime</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "mtime" )."'>mtime</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "perms" )."'>perms</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "group" )."'>group</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "owner" )."'>owner</a></TH>\n";
echo "<TH><a href='".genUrl( $ref, $args, "sort", "inode" )."'>inode</a></TH>\n";
echo "<TH>View</TH>\n";
echo "</TR>\n";
@usort( $lFiles, cmp );
for( $i = 0; $i < $n; $i++ )
{
if( ( $i < $from ) || ( $i >= $to ) )
continue;
$k = $i;
echo "<TR>\n";
echo "<TD><INPUT TYPE='checkbox' NAME='id_$k' VALUE='".
$lFiles[ $k ]->name
."'></TD>\n";
$IMG=getIcons( $lFiles[ $k ]->ext );
$dform = "M j y H:i";
// echo "<TD ALIGN=CENTER >".$lFiles[ $k ]->type."</TD>\n";
echo "<TD>$IMG".$lFiles[ $k ]->name."</TD>\n";
echo "<TD ALIGN=RIGHT >".$lFiles[ $k ]->formatSize()."</TD>\n";
echo "<TD>".$lFiles[ $k ]->ext ."</TD>\n";
echo "<TD>".date( $dform, $lFiles[ $k ]->atime )."</TD>\n";
echo "<TD>".date( $dform, $lFiles[ $k ]->ctime )."</TD>\n";
echo "<TD>".date( $dform, $lFiles[ $k ]->mtime )."</TD>\n";
echo "<TD>".$lFiles[ $k ]->perms."</TD>\n";
echo "<TD>".$lFiles[ $k ]->group."</TD>\n";
echo "<TD>".$lFiles[ $k ]->owner."</TD>\n";
echo "<TD>".$lFiles[ $k ]->inode."</TD>\n";
switch( $lFiles[ $k ]->type )
{
case "link":
if( $lFiles[ $k ]->stype == "dir" )
{
$tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name;
echo "<TD><a href='".
genUrl( $ref, $args, "cd", $tcd )."'>".
$lFiles[ $k ]->sfile."</a></TD>\n";
}
else
echo "<TD>".$lFiles[ $k ]->sfile."</TD>\n";
break;
case "dir":
$tcd = $lFiles[ $k ]->path."/".$lFiles[ $k ]->name;
echo "<TD><a href='".
genUrl( $ref, $args, "cd", $tcd )."'>".
$lFiles[ $k ]->name."</a></TD>\n";
break;
case "file":
echo "<TD>".$lFiles[ $k ]->sfile."</TD>\n";
break;
default:
echo "<TD>NO</TD>\n";
break;
}
echo "</TR>\n";
}
echo "</TABLE>\n";
$from = $from - $step;
if( isset( $cd ) )
{
echo "<INPUT TYPE='hidden' NAME='cd' VALUE='$cd'>\n";
}
echo "<INPUT TYPE='hidden' NAME='nb' VALUE='$n'>\n";
//echo "<br>from=$from;to=$to;n=$n\n";
echo "<br>\n";
if( $from >= 0 )
{
echo "<a href='".
genUrl( $ref, $args, "from", $from )."' >Prev</a>/\n";
}
if( $to <= $n )
{
echo "<a href='".
genUrl( $ref, $args, "from", $to )."' >Next</a> \n";
}
echo "<br>\n";
echo "<INPUT TYPE='submit' VALUE='Del'>\n";
echo "</FORM>\n";
?>
</body>
</html>
Kann man das irgendwie vereinfacht darstellen so steigt da ja keiner durch !?
Hello,
Kann man das irgendwie vereinfacht darstellen so steigt da ja keiner durch !?
Du könntest das selber machen. Das wird dann vermutlich kompakter und sehr viel verständlicher.
An diesem Script wird wohl eher keine Hand anlegen, denn es ist ja überhaupt nicht kommentiert.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello
Alles klar werd mich mal ransetzen und es versuchen :)
schöne Grüße willy96
Hello,
Alles klar werd mich mal ransetzen und es versuchen :)
Denk an die Trennung von
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Guten Morgen
Ich habe jetzt einfach mein Upload Script genommen und dieses in ein Unlink Script umgewandelt.
Kann man so etwas machen?
Es Funktioniert !:)
Nur leider öffnet sich dummerweise wenn man auf das Filefield klickt natürlich die Auswahl der Files auf dem eigenen Rechner.
Meine Frage hier:
Kann man dem Filefield sagen anstatt den eigenen Rechner zu browsen, den Server, oder einen Spezifischen Pfad, zu browsen ?
Vielen Dank
Grüße willy96
Achso hier mal mein Script:
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(-utf8);
use File::Copy;
use CGI::Carp qw(fatalsToBrowser);
use File::Basename;
$CGI::POST_MAX = 300_000_000_000;
my $c = CGI->new;
if($c->param)
{
print $c->header(-charset => 'utf-8'), $c->h2('Result');
my $fh = $c->param('delfile'); # Get the FileHandle from temp-File
my $source = $c->tmpFileName($fh); # get the source filename
my $dest = $fh; # scalar context, origin filename from UserAgent
my $ref = [fileparse($dest)]; # Dateiname in [0]
print "Der Delete war Erfolgreich";
unlink $source, "/var/www/Fileserver/$ref->[0]";
print $c->h2('Navigation'),
$c->start_form( -enctype => 'multipart/form-data'),
$c->button(-name => 'back', -value => 'back', -onclick => 'javascript:history.go(-1)'")
$c->button(-name => 'back2', -value => 'zum Fileserver', -onclick => "location....")
$c->end_form;
}
else{ # Erzeuge das Upload-Formular
print $c->header(-charset => 'utf-8'),
$c->h2('send a file'),
$c->start_form( -enctype => 'multipart/form-data'),
$c->textfield(-name => 'delfile'),
$c->submit(-name => 'remove', -value => 'Datei löschen'),
$c->reset(-name => 'clear', -value => 'Feld löschen'),
$c->button(-name => 'back', -value => 'Zurück zum Fileserver', -onclick => "location....")
$c->end_form;
}
Hier ist das Filefield das Textfield hatte es in Textfield umbenannt weil sich so nicht der Filebrowser öffnet :)
Bounjoun willy96,
Hier ist das Filefield das Textfield hatte es in Textfield umbenannt weil sich so nicht der Filebrowser öffnet :)
Wenn ich richtig verstehe, willst du folgendes:
1. User darf eine/mehrere Dateien uploaden
2. User darf überprüfen, welche Dateien im Verzeichnis sind und
ggfs. Dateien wieder entfernen
Den ersten Punkt hast du bereits gelöst.
Du suchst jetzt eine Lösung für den zweiten Punkt.
Und genauso, wie hier 2 Punkte aufgelistet sind, würde ich das ganze in zwei Schritten realisieren:
1. wie Punkt 1, nur enthält die Ausgabe des Upload-Skripts einen
Link, der wie folgt heißen könnte: Dateien jetzt überprüfen?
2. dieser Link verweist auf einem zweiten Skript oder eine Subroutine
des Upload-Skripts, die folgendes macht:
• mit opendir(), readdir() die Dateien im Verzeichnis ausliest
• mit grep die . und .. und evtl. Dateien, die der User nicht
sehen soll, entfernt
• die Elemente des verbliebenen Arrays in einer Schleife durch-
geht und eine Ausgabe mit den Dateinamen und einer Checkbox
davor erstellt. Das ist ein Formular, das beim Submit das
Skript wieder aufruft, das dann mit unlink() die zum Löschen
ausgewählten Dateien entfernt
In Perl in kurzer Zeit erledigt.
Adiou.
Hello P.,
• die Elemente des verbliebenen Arrays in einer Schleife durch-
geht und eine Ausgabe mit den Dateinamen und einer Checkbox
davor erstellt. Das ist ein Formular, das beim Submit das
Skript wieder aufruft, das dann mit unlink() die zum Löschen
ausgewählten Dateien entfernt
Und eben genau hier liegt der Fehler. Löschen ohne Session ist Genickbruch auf Raten für den Server. Es darf keinesfalls der per Post übertragene Klartextname der Datei dazu benutzt werden, diesen direkt in die Unlink-Anweisung einzusetzen.
Hier muss dringend nochmal überprüft werden, ob dieser Name auch in der Liste der erlaubten Dateien vorhanden ist, also ob der Pfad zum Verzeichnis passt und der User die Datei überhauot löschen darf.
Sonst könnte jede Datei des Systems, auf die der Perl-User passende Rechte hat, gelöscht werden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Bounjoun Tom,
Sonst könnte jede Datei des Systems, auf die der Perl-User passende Rechte hat, gelöscht werden.
Klar, Sicherheitsmaßnahmen müssen her.
Adiou.
Hello P.,
Sonst könnte jede Datei des Systems, auf die der Perl-User passende Rechte hat, gelöscht werden.
Klar, Sicherheitsmaßnahmen müssen her.
Nur, um das nochmal kalr auszusprechen. Man könnte ja denken, "wieso? ich habe doch nur die Namen der vorhandenen Dateien angeboten im Löschformular. Da kann der User vorm Client doch gar keinen anderen Dateien löschen".
Aber eben hier liegt ein häufiger Fehler. Der User vorm Client könnte per eigenem Formular oder sonstig selbst gestaltetem Request jeden ausgedachten Namen einsetzen. Und der würde dann auch zur Löschung eingesetzt werden...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Re!
1. wie Punkt 1, nur enthält die Ausgabe des Upload-Skripts einen
Link, der wie folgt heißen könnte: Dateien jetzt überprüfen?
Alternativ kannst du gleich bei der Ausgabe des Uploads den zweiten Schritt einbauen: »Das Verzeichnis enthält nun folgende Dateien, die Sie wieder entfernen können«.
• mit opendir(), readdir() die Dateien im Verzeichnis ausliest
• mit grep die . und .. und evtl. Dateien, die der User nicht
sehen soll, entfernt
• die Elemente des verbliebenen Arrays in einer Schleife durch-
geht und eine Ausgabe mit den Dateinamen und einer Checkbox
davor erstellt. Das ist ein Formular, das beim Submit das
Skript wieder aufruft, das dann mit unlink() die zum Löschen
ausgewählten Dateien entferntIn Perl in kurzer Zeit erledigt.
Adiou.