Hab jetzt noch ein bisschen probiert und sehr viel gelesen (hier und hier), aber irgendwie sehe ich da einfach nicht durch. Nachdem soweit alles selbst geschrieben ist (bzw. natürlich mit Deiner Hilfe ) und ich so ziemlich auch alles verstehe, will ich dass nun auch noch selbst irgendwie hinbekommen. Aber ich werde es jetzt erst mal hinten anstellen, denn ehrlich gesagt habe ich von dem Uploader jetzt erst mal mehr als genug. Ohne das Drag'n'drop funktioniert er ja erstmal. Werde ihn jetzt erst mal in meine Seite einbinden und dann hier hochladen.
Beiträge von KATERchen
-
-
Auf die Seite war ich auch gestoßen, dachte mir schon, dass da die Lösung drin steht, aber da mein Englisch naja..., hab sie erst mal wieder verworfen.
Die Möglichkeit, die dort, glaube ich, auch erwähnt wird, ein Array zu erzeugen und dann in PHP die Dateien erst zu löschen, ist mir dann nachts im Bett auch noch eingefallen. Trotzdem hat es mich etwas Nerven gekostet. Aber jetzt funktioniert es :).
Code
Alles anzeigenvar del = []; function dateiauswahl(evt) { var dateien = evt.target.files; // FileList object var imgs = [], names = []; counter = 0, nrimgs = dateien.length, binchar = 97; // Auslesen der gespeicherten Dateien durch Schleife for (let i = 0; i < dateien.length; i++) { let f = dateien[i]; names[i] = f.name; // nur Bild-Dateien if (!f.type.match('image.*')) { nrimgs--; continue; } let reader = new FileReader(); reader.onload = function (e) { console.log("loaded " + i) imgs[i] = e.target.result; counter++; if (counter == nrimgs) { // erzeuge Thumbnails. for (var j = 0; j < imgs.length; j++) { var btn = document.createElement('img'); btn.className = 'delete'; btn.setAttribute('name' , j); btn.src = 'wagen.gif'; var img = document.createElement('img'); img.className = 'bild'; img.src = imgs[j]; img.title = names[j]; var li = document.createElement('li'); li.appendChild(img); li.appendChild(btn); // das Listenelement bekommt einen fortlaufenden Index als ID li.id = j; var sortable = document.getElementById("sortable"); sortable.appendChild(li); del.push(j); } $(function () { $('#sortable').sortable({ update: function (event, ui) { var productOrder = $(this).sortable('toArray').toString(); console.log(productOrder); $('input[name="newsort"]').val(productOrder); } }); }); } // Wenn Bilder aus der Auswahl entfernt werden $("#sortable .delete").click(function() { var del_org = $(this).attr('name'); $(this).parent().remove(); del.splice(del_org, 1, ''); console.log(del); $('input[name="del_org"]').val(del); }); }; // Bilder als Data URL auslesen. reader.readAsDataURL(f); }; } // Auf neue Auswahl reagieren und gegebenenfalls Funktion dateiauswahl neu ausführen. document.getElementById('files').addEventListener('change', dateiauswahl, false);
Was ich jetzt aber nicht hinbekomme, weil ich gar nicht wirklich weiß wo ich anfangen soll, ist, eine "DropZone" einzurichten, also ein Bereich, wo ich die Bilder per Drag n Drop raufziehen kann. Wie mir scheint, hätte ich das wohl von Anfang an einbauen sollen. Aber ich finde leider keine wirklich verständliche Erklärung.
-
Zu dem Script in #14 habe ich jetzt doch noch mal eine Frage. Und zwar will ich eine Möglichkeit anbieten, dass einzelne Bilder aus der angezeigten Liste auch wieder gelöscht werden. Eigentlich sollte das doch gar nicht so schwer sein. Dass sie optisch entfernt werden, klappt wunderbar, hochgeladen werden sie dann - natürlich - dennoch. Wie kann ich nun also aus f die entsprechenden Einträge löschen? Bei einem Array wäre das ja gar kein Problem, doch offenbar ist f kein Array.
-
Klasse, funktioniert. Mir ist gerade aufgefallen, dass ich die checkdir,php inner irgendwie als JavaScript gesehen habe. Keine Ahnung warum. daher habe ich mich gar nicht allzusehr damit beschäftigt.
Das mit glob() kannte ich noch gar nicht, ist aber interessant. Aber was macht PHP_EOL? Hab die Erklärung auf php.com nicht wirklich verstanden.
-
Die Lightbox ist Eigenbau. Die Ausgabe der Bilder ist auch kein Problem, das läuft.
Ich habe alles hier mal hochgeladen. Gib die ArtNr bla ein und gehe aus dem Input-Feld. Die Lightbox informiert darüber, dass der Ordner existiert. Nun will ich aber die Bilder aus diesem Ordner auch angezeigt bekommen. Das ".uploads/bla/" ist praktisch der Inhalt von vdir, den kann ich aber nur anzeigen, nicht an PHP weiter geben, damit so das Verzeichnis ausgelesen werden kann.
-
Vom Prinzip her ist es immer noch das Gleiche wie in #7 nur dass dort pdir statt vdir übergeben wird.
-
Mit dem Cookie hat es dann doch nicht geklappt, der wird ja erst beim nächsten Aufruf der Seite aktiv.
Ich habe jetzt den ganzen Tag an dem Problem gesessen und bin kein Stück weiter gekommen, obwohl es doch eigentlich ganz einfach sein müsste.
Der Download-Pfad wird per Ajax als vdir an die checkdir.php übergeben. Ich muss doch jetzt den Inhalt von vdir irgendwie an die ursprüngliche Seite zurückgeben können.
Das Einzige, was ich geschafft habe - das war schon so einfach dass es mich fast verhöhnt - dass ich den Inhalt als String in einem DIV angezeigt bekomme.
-
Ja, das war dann wirklich ganz einfach.
Jetzt habe ich seit gestern eine neue Idee und vermutlich das das jquery von oben auch hier die Lösung, Ich weiß nur noch nicht wie.
Wenn ein Verzeichnis bereits vorhanden ist, öffnet sich eine Lightbox mit der Abfrage, was mit den vorhandenen Bildern passieren soll. Jetzt will ich dem Nutzer auch auch die Möglichkeit geben, gleich in diesem Fenster die Bilder zu sehen. Ich muss also in der Lightbox das Verzeichnis auslesen, der Verzeichnisname steckt aber lediglich in einer jquery-Variable. Kann ich vdir (oben) von der checkdir.php wieder zurückgeben und auffangen?
[edit]
Hat sich erledigt, habe einfach ein Coockie gebacken
-
Naja, wenigstens die PHP-Datei hatte ich richtig :).
Ja, so funktioniert es jetzt, danke :). Das war das, was ich eigentlich für das leichte Problem gehalten habe, jetzt kommt das Schwierige - die Ausgabe des Fensters abzufangen und auszuwerten. Aber wie es mir gerade scheint ist das eigentlich ganz simpel. Denke, das bekomme ich hin.
Wirklich mal #Sempervivum, ohne Dich würde ich ganz schön alt aussehen. Danke.
-
Ich habe das Directory-Browsing freigegeben (glaube ich jedenfalls), funktioniert aber immer noch nicht.
Alleine des Lernens wegen gefällt mir aber die zweite Variante eh besser.
Ich glaube, ich habe gerade googles CO2-Bilanz gekippt, verstehe es aber immer noch nicht so richtig und bekomme es auch nicht zum Laufen.
Zuerst mal, muss es nicht in Zeile 7 data: vdir heißen?
Wie gebe ich nun aber das Ergebnis der checkdir.php zurück? Ich habe es auch schon mit success statt .done versucht, doch während das Zweite immer sagt, das Verzeichnis existiert nicht behauptet das Erste IMMER, das Verzeichnis existiere.
Das Problem ist aber auch, dass es beinahe keine passenden PHP-Dateien zu den Scipten bei googel zu finden gibt.
-
Offenbar resultiert es immer in einem Fehler, wenn Du ein Verzeichnis als URL in einem Ajax-Aufruf angibst. Schreibe stattdessen ein Miniscript, das mit file_exists() prüft, ob das Verzeichnis existiert und gib eine entspr. Kennung z. B. "true"/"false" zurück,
in PHP? das ist kein Problem,
die kannst Du dann in done() auswerten kannst.
aber hier kann ich Dir nicht folgen. Zu done() habe ich nicht viel gefunden und das Wenige bezieht sich immer auf ein und dasselbe Script, welches ich irgendwie nicht verstehe.
-
Dann ist auf dem Server eine PHP Version < 7,
Ahh, stimmt. hat sich wohl bei der Serverumstellung letztens zurückgesetzt. Hatte das schon mal auf 7,nochwas eingestellt.
Danke
-
Hallo,
ich habe da wohl eine Gedanken-Blockade oder so was.
Auf einer Upload-Seite kann ich ein zu erstellendes Verzeichnis angeben. Wenn dieses Verzeichnis existiert soll gefragt werden, was mit den hochzuladenden Dateien passieren soll. Lokal funktioniert die Erkennung ganz gut, es öffnet sich eine LightBox und fragt, was eben passieren soll. Aber wie gebe ich das Resultat jetzt weiter. Ich bin mir sicher, dass es etwas ganz simples ist, aber irgendwie komme ich nicht drauf.
Außerdem habe ich jetzt feststellen müssen, dass das Scirpt
Code
Alles anzeigen<script> // prüfen ob Verzeichnis existiert function check(txt){ var url = ($("#text").val()); var url = './upload/' + url + '/'; console.log(url); $.get(url) .done(function() { $('#frage').animate({"opacity": "1"}, 500); $('#background').animate({"opacity": ".70"}, 500); $('#background, #frage').css({"display": "block" , "margin": "1% auto"}); console.log('exists code'); }).fail(function() { console.log('not exists code'); }) } </script>
auf meinem Server gar nicht funktioniert. Angeblich existiert ein existierendes Verzeichnis nicht.
Zum Testen hier mal klicken. Das Verzeichnis test existiert.
-
noch mal kurz ne Frage. Was soll in Zeile 12 ($sortArray = explode(",", $_POST['newsort'] ?? "");) das Ende (?? "") bedeuten? Hab das erst nicht weiter beachtet, da es lokal funktioniert hat, aber auf dem Server gibt es eine Fehlermeldung aus.
-
-
Super, jetzt geht es. Nu muss ich nur noch rausfinden, warum :), aber das bekomme ich hin.
DANKE!
Da habe ich eine Weile gebraucht, um durchzusteigen,
Ja, dass höre ich öfters. Hab wohl eine ganz spezielle (unlogische) Art zu scripten. Meistens räume ich dann ganz zum Schluss immer noch mal kräftig auf.
-
Werde es mir mal ansehen. Welches Sortable ist das, das von jQuery-UI?
Ja, genau das.
Aber das merkwürdige ist, bis hierher scheint alles zu stimmen. Das ist die Ausgabe vom PHP-Script:
CodeoldName:./upload/bla/tmp/blaa.jpg = newName:./upload/bla/tmp/tmp_blae.jpg oldName:./upload/bla/tmp/blab.jpg = newName:./upload/bla/tmp/tmp_blab.jpg oldName:./upload/bla/tmp/blac.jpg = newName:./upload/bla/tmp/tmp_blac.jpg oldName:./upload/bla/tmp/blad.jpg = newName:./upload/bla/tmp/tmp_blad.jpg oldName:./upload/bla/tmp/blae.jpg = newName:./upload/bla/tmp/tmp_blaa.jpg
und gleich in der nächsten Zeile erfolgt der Upload, aber der klappt dann nicht mehr. Für mich sehe ich da eigentlich keinen Zusammenhang mit Deinem Scirpt...
-
Super, dass funktioniert. Allerdings habe ich nun ein recht merkwürdiges, neues Problem im Zusammenhang mit der Sortierung.
Wenn ich die Bilder vor dem Upload neu sortiere scheint vom PHP-Script alles richtig zu laufen. Dennoch werden die hochgeladenen Dateien falsch benannt. Das gab es mit dem alten Script nicht. Allerdings erkenne ich auch keinen Zusammenhang, Da die Übergabe der Sortierung scheinbar richtig erfolgt.
Ich weiß leider gerade nicht, wie ich ein Beispiel hochladen könnte. Zumindest aber den Code:
Hier habe ich nur die Sortier-Funktion mit eingefügt, sonst nichts geändert.
Code
Alles anzeigenfunction dateiauswahl(evt) { var dateien = evt.target.files; // FileList object var imgs = [], names = []; counter = 0, nrimgs = dateien.length, binchar = 97; // Auslesen der gespeicherten Dateien durch Schleife for (let i = 0; i < dateien.length; i++) { let f = dateien[i]; names[i] = f.name; // nur Bild-Dateien if (!f.type.match('image.*')) { nrimgs--; continue; } let reader = new FileReader(); reader.onload = function (e) { console.log("loaded " + i) imgs[i] = e.target.result; counter++; if (counter == nrimgs) { // erzeuge Thumbnails. for (var j = 0; j < imgs.length; j++) { var img = document.createElement('img'); img.className = 'bild'; img.src = imgs[j]; img.title = names[j]; var li = document.createElement('li'); li.appendChild(img); li.id = String.fromCharCode(97 + j); counter++; var sortable = document.getElementById("sortable"); sortable.appendChild(li); binchar++; $(function() { $('#sortable').sortable({ update: function(event, ui) { var productOrder = $(this).sortable('toArray').toString(); console.log(productOrder); $('input[name="newsort"]').val(productOrder); } }); }); } } }; // Bilder als Data URL auslesen. reader.readAsDataURL(f); }; } // Auf neue Auswahl reagieren und gegebenenfalls Funktion dateiauswahl neu ausführen. document.getElementById('files').addEventListener('change', dateiauswahl, false);
PHP
Alles anzeigen<?php $sortArray = explode(",",$_POST['newsort']??""); if(!empty($_FILES)){ error_reporting(E_ALL); ini_set('display_errors', '1'); $upload = "./upload/"; $counter = count($_FILES['files']['tmp_name']); $sourcePath[] = $_FILES['files']['tmp_name']; // Storing source path of the file in a variable $targetPath[] = $_FILES['files']['name']; // Target path where file is to be stored $name = $_POST['name']; mkdir("./upload/" . $name, 0700); mkdir("./upload/" . $name . "/tmp/", 0700); $bilder_verzeichnis = $upload . $name . "/"; $tmp_verzeichnis = $upload . $name . "/tmp/"; // Größe der ausgegebenen Bilder $XL_groesse = 600; $L_groesse = 175; $M_groesse = 45; // Bilder werden in tmp-Ordner geladen for($a = 0; $a < $counter; $a++){ $i = $a + 97; $up_name = $name . chr($i) . ".jpg"; $tmpFile = $_FILES['files']['tmp_name'][$a]; if ($tmpFile != ""){ $newFilePath = $upload . $name . "/tmp/" ; //Upload der Datei in den Ordner if(move_uploaded_file($tmpFile, $newFilePath . $up_name)) { } } } // Bilder aus tmp-Verzeichnis lesen if(is_dir($bilder_verzeichnis)) { // existiert das Verzeichnis? $files = scandir($tmp_verzeichnis); // Dateinamen in Array einfügen $files = array_splice($files, 2); // Entfernt die ersten beiden Einträge . und .. $files_count = count($files); } // Ist eine Umsortierung erfolgt: if($_POST['newsort'] != 1){ $sortArray = explode(",",$_POST['newsort']??""); $c = array_combine($files, $sortArray); // Zuordnen der neuen zu den alten Namen und umbennenen in tmp_dateiname foreach($c AS $oldName => $newName){ $oldNameDir = $tmp_verzeichnis . $oldName; $newNameDir = $tmp_verzeichnis . "tmp_" . $name . $newName . ".jpg"; echo 'oldName:' . $oldNameDir . ' = '; echo 'newName:' . $newNameDir . '<br>'; copy($oldNameDir , $newNameDir); } } // ist keine Sortierung erfolgt, umbenennen in tmp_dateiname else{ foreach($files AS $oldName){ $oldNameDir = $tmp_verzeichnis . $oldName; $newNameDir = $tmp_verzeichnis . "tmp_" . $oldName; copy($oldNameDir , $newNameDir); unlink($oldNameDir); } } // tmp-Verzeichnis auslesen if(is_dir($bilder_verzeichnis)) { // existiert das Verzeichnis? $org_files = scandir($tmp_verzeichnis); // Dateinamen in Array einfügen $org_files = array_splice($org_files, 2); // Entfernt die ersten beiden Einträge . und .. } // Bildgröße erstellen foreach($org_files AS $tmp_files){ $XL_name = 'XL_' . str_replace("tmp_","",$tmp_files); $L_name = 'L_' . str_replace("tmp_","",$tmp_files); $M_name = 'M_' . str_replace("tmp_","",$tmp_files); $XL_size = GetImageSize($tmp_verzeichnis . $tmp_files); if($XL_size[1] > 500){ $breite = $XL_size[0]; $hoehe = $XL_size[1]; if($XL_size[2]==2) { // Erstellen XL_Bilder $neueBreite=intval($breite*$XL_groesse/$hoehe); $altesBild=ImageCreateFromJPEG($newFilePath . $tmp_files); $neuesBild=imagecreatetruecolor($neueBreite,$XL_groesse); ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$XL_groesse,$breite,$hoehe); ImageJPEG($neuesBild , $bilder_verzeichnis . $XL_name); ImageDestroy($neuesBild) ; ImageDestroy($altesBild) ; // Erstellen L_Bilder $neueBreite=intval($breite*$L_groesse/$hoehe); $altesBild=ImageCreateFromJPEG($newFilePath . $tmp_files); $neuesBild=imagecreatetruecolor($neueBreite,$L_groesse); ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$L_groesse,$breite,$hoehe); ImageJPEG($neuesBild , $bilder_verzeichnis . $L_name); ImageDestroy($neuesBild) ; ImageDestroy($altesBild) ; // Erstellen M_Bilder $neueBreite=intval($breite*$M_groesse/$hoehe); $altesBild=ImageCreateFromJPEG($newFilePath . $tmp_files); $neuesBild=imagecreatetruecolor($neueBreite,$M_groesse); ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$M_groesse,$breite,$hoehe); ImageJPEG($neuesBild , $bilder_verzeichnis . $M_name); ImageDestroy($neuesBild) ; ImageDestroy($altesBild) ; } } unlink($tmp_verzeichnis . $tmp_files); } rmdir($tmp_verzeichnis); } ?> <a href="test.php">Zurück</a>
-
Hört sich soweit logisch an. Ich habe jetzt noch nicht weiter daran rumprobiert, aber ich bezweifle, dass das wirklich funktioniert. Bei einem Test sind die Thumbnails wieder durcheinander, der Quellcode ist aber richtig geordnet.
-
Kannst du uns bitte den Codeteil zeigen?
Ups, völlig vergessen.
Code
Alles anzeigen<main> <p>Es wird ein Eingabefeld erzeugt, das Attribut multiple sorgt dafür, dass im Auswahldialog mehrere Dateien ausgewählt werden können </p> <form enctype="multipart/form-data" action="test_up.php" method="POST"> <input id='inputvalue' type='hidden' name='newsort' value='1' /> <input type="text" id="text" name="name" oninput="myFunction(this)" /> <input type="file" id="files" name="files[]" multiple /> <button type="submit" id="input1" name="action" disabled>Hochladen</button> </form> <script> function myFunction(txt) { var bt = document.getElementById('input1'); if (txt.value != '') { bt.disabled = false; } else { bt.disabled = true; } } </script> <p>Ein Ausgabefeld zur Anzeige der ausgewählten Dateien:</p> <output id="list"><ul id="sortable"></ul></output> </main>
Code
Alles anzeigenfunction dateiauswahl(evt) { var dateien = evt.target.files; // FileList object var counter = 97; // Auslesen der gespeicherten Dateien durch Schleife for (var i = 0, f; f = dateien[i]; i++) { // nur Bild-Dateien if (!f.type.match('image.*')) { continue; } var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { // erzeuge Thumbnails. var img = document.createElement('img'); img.className = 'bild'; img.src = e.target.result; img.title = theFile.name; var li = document.createElement('li'); li.appendChild(img); li.id = String.fromCharCode(counter); counter++; var sortable = document.getElementById("sortable"); sortable.appendChild(li); $(function() { $('#sortable').sortable({ update: function(event, ui) { var productOrder = $(this).sortable('toArray').toString(); console.log(productOrder); $('input[name="newsort"]').val(productOrder); } }); }); }; })(f); // Bilder als Data URL auslesen. reader.readAsDataURL(f); } } // Auf neue Auswahl reagieren und gegebenenfalls Funktion dateiauswahl neu ausführen. document.getElementById('files').addEventListener('change', dateiauswahl, false);