Zum Inhalt springen

[php] Links zu Dateinamen auslesen


Empfohlene Beiträge

Hallo,

ich möchte einen Button, über den es möglich ist, seinen Explorer anzuzeigen, dort eine Datei auszuwählen und dann den Dateinamen + Pfad an den Server zu übertragen.... geht das?!

Also z.B. liegt im Ordner C:\Temp\ die Datei test.doc.

Nun möchte ich über einen Button oder sowas halt nen Explorer öffnen, den User durch seine Ordner navigieren lassen... er wählt C:\Temp\test.doc aus, sagt ok und ich habe als Ergebnis "C:\Temp\test.doc" ...

Es gibt ja schon tolle PHP-Funktionen wie basename() oder dirname() ... aber wie verbinde ich das mit einem Durchsuchen-Button?! :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich input type="file" verwende, bekomme ich nur den Dateinamen einer Datei, aus "C:\Temp\test.doc" wird "test.doc" ... ich brauche aber unbedingt den ganzen Pfad, da ich den Link zu dieser Datei in einer Datenbank speichern will....
Die Datei selbst möchtest du sicher nicht in der Datei oder sonstwie auf dem Server speichern? Fürchte, nur mit HTML-Mitteln wirst du da nicht hinkommen. Der Webserver (und mithin PHP) hat einfach keine direkte Verbindungzum lokalen Dateisystem des Users, und der <input type=file> macht nichts anderes, als den kompletten Inhalt der Datei (samt Dateiname, aber halt ohne Pfad) an den Server zu übermitteln.

Schonmal über ein VBScript nachgedacht? Ist zwar "böse" und nur für IEgitt, dürfte Deine Idee aber am leichtesten lösen. Zumal wenn ich davon ausgehen darf, dass es sich hierbei um eine rein interne Angelegenheit handeln dürfte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ach jetzt verstehe ich :D hmm, also ich habe sowas noch nie gebraucht, aber eine idee wäre es mit JS den Inhalt des Fensters, nachdem die Datei ausgewählt worden ist, auszulesen und ein hiddenfield mit diesem inhalt zu erzeugen. weiss nicht obs geht, aber da würde ich ansetzen
Doch! Das Auslesen per JS ist denk ich mal schon ein guter Ansatz (sicher besser als mein kruder Ansatz mit VBS:floet:). Ich würde aber irgendwie anraten, den file-Input ausserhalb desjenige Formulars zu legen, mit welchem man letztlich das PHP zum Speichern aufruft.

also ganz grob:


<script>

function SubmitForm() {

  document.sForm.inpDateiname.value = document.iForm.inpDatei.value;

}

</script>

<form name="iForm">

<input type="file" name="Datei" value="">

</form>

<form name="sForm" action="xyz.php" onSubmit="SubmitForm();">

<input type="hidden" name="Dateiname" value="">

<input type="submit" value="Los damit">

</form>

Obs so geht, hab ich aber nicht getestet...

Link zu diesem Kommentar
Auf anderen Seiten teilen

VBS müsste ich euch auch enttäuschen, damit habe ich noch nix gemacht...und JavaScript bin ich auch kein Held, da ich immer so weit möglich drauf verzichten möchte... aber werde den Ansatz mal ausprobieren.

Das ganze ist nur für was internes. Wir haben einen Fileserver, auf dem tausende von .docs, .xls etc. liegen. Ich möchte nun Pfade zu diesen Dateien in einer DB speichern in der Art "\\Fileserver\Docs\document1.doc" ... und deshalb brauche ich den ganzen Pfad und den Dateinamen.

Und nur HTML muss/soll es gar nicht sein. am Besten wäre natürlich PHP.... aber das ist nun mal serverseitig... :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich glaube, ich habe es jetzt... zumindest scheint es zu gehen... hier der Code:


<html>
<head>
<script type="text/javascript">
function getPath(filename)
{
var fullPath = "";
var dirs = filename.split("\\");
for(var i = 0; i < dirs.length - 1; i++)
{
fullPath = fullPath + dirs[i] + "\\";
}
document.path.path.value = fullPath;
}
</script>
</head>
<body>
<form name="path" action="submit.php" method="post">
<input type="file" name="filename" onChange="getPath(this.value)" onFocus="getPath(this.value)" onKeyup="getPath(this.value)" size="50"></input>
<input type="submit" value="ok" name="ok"></input>
</form>
</body>
</html>
[/php]

Auf der Seite submit.php dann einfach

[php]echo $_POST['filename'];

... ist aber nur für Windows, deswegen die "\\"-Angabe... aber bei meinem Fileserver handelt es sich ausschließlich um einen Windows-Server.

Ich habe jetzt mal onChange(), onFocus() und onKeyUp() verwendet... aber hätte nicht onChange() gereicht? Bin mir da recht unsicher...

Aber vielen Dank für eure tollen Tipps... da wäre ich so schnell nicht drauf gekommen... :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auch mal mit meinem Ansatz oben (über zwei Forms) ausprobiert?

Ja :(

... ist das eine Sicherheitslücke, die ich da die ganze Zeit missbrauche und nur der IE hat sie? Ich verstehe nicht, warum das nur im IE geht, das sollten doch *eigentlich* auch Mozilla und Opera verstehen...

... habe auch mal OnBlur() und andere Fokus-Dinger ausprobiert - kein Erfolg... :( Aber wenn das nur im IE geht, dann bringt es mir irgendwie gar nix....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja :(

... ist das eine Sicherheitslücke, die ich da die ganze Zeit missbrauche und nur der IE hat sie? Ich verstehe nicht, warum das nur im IE geht, das sollten doch *eigentlich* auch Mozilla und Opera verstehen...

... habe auch mal OnBlur() und andere Fokus-Dinger ausprobiert - kein Erfolg... :( Aber wenn das nur im IE geht, dann bringt es mir irgendwie gar nix....

An eine Sicherheitslücke glaub ich nicht. Vielleicht einfach ein JS-Fehler?

Spiel mal mit folgendem Schnipsel rum, hab ich eben quick'n'dirty in ein .html gehackt, und in FF 1.5 getestet:

<form name="testForm">

<input name="inpTest" type="file">

<form>

<a href="javascript:alert(document.testForm.inpTest.value);">Hier testen</a>

Wenn das so klappt, dann müsste es auch klappen, den testForm.inpTest.value beim Submit eines Forms komplett zu übergeben...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also ich habe deinen Schnipsel auch gestestet, in Mozilla und IE geht es, aber im Opera kommt wieder nur der Dateiname. Und im dem Moment wo ich das Form über ein submit abschicke, ist document.path.inpname.value wieder leer... hmmm.... aber es wäre zumindest schon mal ein Ansatz für Mozilla.... wenn auch noch Opera irgendwie gehen würde wäre mein Tag schon gerettet :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab mir gerade nochmal den Thread angeschaut, vor allem deine Beschreibung, worauf das Ganze hinausläuft (beitrag #8). Und irgendwie frag ich mich, ob Du nicht noch einen gänzlich anderen Ansatz verfolgen solltest... wenn die Dokumente doch alle in einem Verz. (samt Unterverzeichnissen?) auf dem Fileserver liegen, müsste es doch möglich sein, dass der Webserver auf ebendiese Verzeichnisstruktur zumindest Leserechte bekommt, sprich man könnte den gesamten Verzeichnisinhalt via PHP auslesen und im Browser anzeigen -- und mithin dort anweisen, wenn eine Datei samt Verzeichnisname in die DB aufgenommen werden sollte.

Nur mal so am Rande eingeworfen... ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das geht bestimmt....

Aber irgendwie finde ich das unkomfortabel.... ich schreibe mal, wie das ganze laufen soll... :

Es ist eine Kundendatenbank auf Weboberflächen-Basis, die gerade erst aufgebaut wird und noch nicht wirklich Daten beinhaltet. Nun soll man neue Kunden hinzufügen können, dazu gibt es eine NEU-Maske. Bei einigen Kunden gibt es ein paar Docs mit gescannte Sachen, wie z.B. Handelsregisterauszug etc. Diese Dateien existieren schon.

Nun soll in der (neuen) Datenbank festgehalten werden, welche Docs zu welchem Kunden gehören, und das per Link. So das es in der DB ein Memo-Feld gibt in denen beliebig viele Links liegen zu den Docs.

Die Docs liegen auf einem Windows-Fileserver in unserer Domäne. Dort aber an verschiedenen Orten, also keine einheitlichen Ordner.

Deshalb wollte ich so ein <input> Feld haben um die Dateinamen rauszusuchen. Dann kann bei der Eingabe durch die Ordner gewühlt werden und die Docs werden ausgewählt, Pfad und Dateinamen in DB gespeichert und fertig.

Wenn ich nun alle Dateien auflisten würde und sagen würde "klick die an, die passen" dann müsste ich ~30 Ordnerinhalte mit je ~100 Dateien auflisten... finde ich vom Handling und von der Übersicht her recht unkomfortabel...

...so das ist das Szenario... wenn jetzt noch Einfälle kommen wie "hey, das kann man doch so und so machen" -> nur her damit :)

Danke fürs Lesen bis hierhin und Grüße,

die Sockä!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was meinst du damit...? Gibt es da ne Rubrik? Einen Link oder sowas?
Also ich hab hier einen Schnipsel...

<?
function findfile($location='',$fileregex='') {
if (!$location or !is_dir($location) or !$fileregex) {
return false;
}

$matchedfiles = "";

$all = opendir($location);
while ($file = readdir($all)) {
// Ists eine Datei?
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$matchedfiles.= $file . "<br>";
}
// Ists ein Verzeichnis?
elseif (!is_dir($location.'/'.$file)) {
if (preg_match($fileregex,$file)) {
$matchedfiles.= $file . "<br>";;
}
}
}
closedir($all);
unset($all);
return $matchedfiles;
}

$htmlfiles = findfile('U:/','/\.html?$/');
[...]
?>[/PHP]

Das Ding läuft (so ähnlich jedenfalls) als Bestandteil der index.php auf meinem localhost daheim - der Aufbau der Rückgabe in $matchedfiles müsste natürlich etwas verfeinert werden. In Deinem Fall zB durch Checkboxen.;) und der Regex für die Dateien wird vermutlich irgendwas in der Art /\.(doc|xls|ppt|xxx)$/ sein - aber welche Dateien genau du hast, wirst du selbst sicher am Besten wissen.

Die Funktion findfile sollte bei Dir vielleicht zweistufig arbeiten:

1. Schritt: Je eine Liste Verzeichnisse und eine Liste Dateien einlesen

2. Schritt: Die beiden Listen (separat) sortieren, und zusammengekettet als Result zurückgeben.

Eine Datei würde wie folgt als HTML angezeigt:

[code]<input type="checkbox" name="chk42" value="//SERVER/Dateien/file01.doc">file01.doc[/code]

wobei die 42 natürlich ein fortlaufender Zähler ist. Und dein submit.php untendrunter darf alle chk1..chk999 (jaa...) durchtesten und die angeklickten im passenden Kontext in die DB schreiben.

Ein Unterverzeichnis (auch [font=Courier New][b]..[/b][/font] wäre ein Verzeichnis, welches - anders als in obigem Schnipsel - zu beachten ist!) liefert einen Link auf das gleiche Anzeigeprogramm, nur dass hier dann das entsprechende Verzeichnis aufgelistet wird.

Und ich möchte wetten, wenn Du das Ding etwas durchdenkst (und die Implementierung passt), lassen sich die Dateien für Deinen Zweck um Klassen eleganter als über den Windows-eigenen Datei-Öffnen-Dialog auswählen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Markus,

erstmal viiiiiielen Dank für deine Mühen :)

Ein klitzekleine Anmerkung am Code habe ich: das erste IF ist eine Prüfung auf ein Verzeichnis, das zweite IF auf eine Datei (also die Kommentarzeilen sind falschherum):


// Ists eine Datei? ##### -> Verzeichnis
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".")
{
$matchedfiles.= $file . "<br>";
}
// Ists ein Verzeichnis? ##### -> Datei
elseif (!is_dir($location.'/'.$file))
{
if (preg_match($fileregex,$file)) {
$matchedfiles.= $file . "<br>";;
}
}
[/PHP]

Aber das ist ja nur ein Schönheitsfehler ;)

Ansonsten läuft das Ding, habe es mal fix auf unserem Fileserver ausprobiert ... somit kommt wwwrun da auch ran. Habe es auch noch ein wenig abgeändert, dass $matchedfiles nicht ein string sondern ein mehrdim. Array ist und jeder durchlaufene Eintrag wiederum ein Array ist mit Wert "dir" oder "file" ... das schaut dann so aus:

[code]array(2) { [0]=> array(2) { [0]=> string(4) "file" [1]=> string(47) "Kunde_xy.doc" } [1]=> array(2) { [0]=> string(3) "dir" [1]=> string(9) "Auswertungen" } } [/code]

Soweit so gut... ;)

Aber wie mache ich denn nun die Auswahl der Dateien benutzerfreundlich? Mit Checkboxen finde ich ein wenig anstrengend, da in den Ordnern, die ich durchsuchen werde, locker ein paar hundert Dateien liegen... und die alle per Checkbox auflisten würde ja seitenweise scrollen bedeueten... finde ich nicht so toll.

Andere Idee wäre, eine DropDownListe mit den Verzeichnissen und nach Auswahl des Verzeichnisses würden daneben die Dateien per Checkbox aufgelistet werden ... aber da in einem Verzeichnis schon 100 Dateien liegen könnten, wäre ich wieder beim Problem von eben... Hmmmpfff....

Also wenn du (oder auch andere) für dieses kleine Look-Like-Prob eine Idee haben, dann wäre mir sicherlich geholfen... :)

Aber schon mal danke bis hierhin - diese Idee hat mich schon mal weitergebracht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Unterverzeichnis [...]liefert einen Link auf das gleiche Anzeigeprogramm, nur dass hier dann das entsprechende Verzeichnis aufgelistet wird.

Eeee...jetzt habe ich noch mal diesen Satz genau gelesen und auf der Zunge zergehen lassen.... und bin glaube ich auf deine/eine Idee gekommen... vll. über einen Button ein neues kleines Fenster aufmachen, dort das findfile()-Skript auf dem Oberordner meines Fileservers ausführen, jedes .doc, .xls etc. File per Checkbox anzeigen und jeden Unterordner als Link... wenn klick auf Link in Verzeichnis wechseln und findfile() erneut ausführen und so weiter und so weiter... :)

Wäre das praktisch/benutzerfreundlich/ok?!

Und wenn so... dann kommt wieder mein JavaScript-Unwissen zum Vorschein .... also wie ich ein Fenster öffne auf Button-Klick, das bekomme ich wohl noch hin... aber wenn ich nun in diesem kleinen PopUp-Fenster ein Link habe soll der ja quasi auf das PopUp-Fenster selber zeigen.... wie geht das?! Zumal ich das ja wieder an den Server zur PHP-Ausführung zurückschicken muss.... hmpff...

sockä

(etwas durcheinander und ratlos) ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Antworte ich mir wieder selber ;)

... und zitiere mich auch gleich:

aber wenn ich nun in diesem kleinen PopUp-Fenster ein Link habe soll der ja quasi auf das PopUp-Fenster selber zeigen.... wie geht das?!

Hehe... Probieren geht über studieren....

über window.open("path.php" ,..., ...) öffne ich die PHP-Seite... und wenn ich da einfach stump einen Link auf die Seite selber mache, arbeitet er ja in dem Fenster weiter... herrje war das stump :)

Schließlich ist das Fenster, auch wenn es von JavaScript ERZEUGT wurde, kein neues, böses, anderes Fenster sondern ein stumpes Browserfenster, was nur nicht so groß ist wie die anderen... ;)

btw. Wieso reagieren die Browser nicht auf die Angabe "resizable=no" in der window.open()-Angabe?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also mit Popups würd ich gar nicht anfangen:) Eher mit einer Dropdown-Liste, wo der User im angezeigten Verzeichnis auswählen/filtern kann, welche Dateien angezeigt werden sollen. Kann man übrigens ganz wunderbare JavaScript-Spielereien mit machen, wenn man die nicht anzuzeigenden Dateien einfach ausblendet.

Checkboxen vor dem Dateinamen sind von der Ergonomie her das Sicherste - um ganz sicher zu gehen, eine Datei so anzeigen, dass bei Klick auf Dateiname die entsprechende Checkbox ein- bzw. ausgeschaltet wird.

Und für das Navigieren im Verzeichnisbaum:

  • Erster Aufruf: /submit.php (befindet sich im Root) ohne Verzeichnis = startet im Root
  • Aufruf /submit.php?path=docs zeigt die Dateien im Verzeichnis /docs an
  • Im HTML-Output für Verzeichnisse Links generieren:
  • <a href="/submit.php?path=docs//2006"> wechselt das Verzeichnis eine Ebene tiefer
  • <a href="/submit.php?path="> wechselt in das Root-Verzeichnis (weil path leer, Achtung: Ggf. prüfen ob path definiert ist und wenn nicht, dann erst leer)
  • Für einen Wechsel ins übergeordnete Verzeichnis relativ zum aktuellen müsstest du den Link separat erstellen (in meinem obigen Source wäre das der Fall $file= "..").

Ohgott, so viele "tolle" Ideen und keine Zeit, das alles mal sauber zu implementieren (aber reizen täte mich das schon).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also *eigentlich* geht alles, ich habe nur ein Prob... wenn ich so durch die Verzeichnisse wandere füllt sich mein Path mit Slahes und sieht nach 10 besuchten Ordnern mitunter schon mal so aus:

\\\\\\\\\\\\rechnungen\\\\\\\20005\\\\\\\\abc.doc

Ich habe schon überall, wo $path als Link übergeben wird ein stripslashes() gemacht, aber die Dinger werden trotzdem immer so komisch.

Das passiert auch nur, wenn ich hoch- und runter durch die Ordner navigiere. Gehe ich nur tiefer in der Ordnerstruktur macht er es richtig und es kommen vernünftige Pfade bei raus. Wandere ich hoch, werden \\\\\ rangehängt.

Vll. ist auch mein "Hochgehen" zu naiv gedacht; hier der Code:


if($path != "")
{
$pathParts = explode('\\\\', $path);
$up = "";
for($i = 0; $i < count($pathParts)-2; $i++)
$up .= $pathParts[$i] . "\\";

echo '<a href="selector.php?path='.$up.'">..</a>';
}
[/php]

...?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...