Nach knapp 2 Wochen habe ich für die oben genannten Probleme leider immernoch keine lösung gefunden.
Und es ist ein Problem dazu gekommen.
Beim move upload file werden Dateien mehrfach aus dem tmp Ordner ins Zielverzeichnis geschoben. Vermutung habe ich hier, dass das Formular mit einem Klick mehrfach abgesendet wird. Ich bin mir da aber absolut unsicher.
Effekt:
Bei 3 Upload-Slots wird wie folgt ge-'moved' und in die DB eingetragen:
( Dateiname besteht aus "Datum-UserID-Dateiname.Endung" und ist daher eindeutig dem Verlauf zuzuordnen)
1. uploadslot wird verarbeitet, dateiA gemoved nach Ziel A, datenbankeintrag getätigt.
2. uploadslot wird verarbeitet, dateiA gemoved nach Ziel A, datenbankeintrag getätigt.
uploadslot wird verarbeitet, dateiB gemoved nach Ziel B, datenbankeintrag getätigt.
3. uploadslot wird verarbeitet, dateiA gemoved nach Ziel A, datenbankeintrag getätigt.
uploadslot wird verarbeitet, dateiB gemoved nach Ziel B, datenbankeintrag getätigt.
uploadslot wird verarbeitet, dateiC gemoved nach Ziel C, datenbankeintrag getätigt.
... Es ist eindeutig definiert, dass bei 1. "dateiA" gemoved werden soll, bei 2. "dateiB" - usw.
// Move-Struktur ist:
if (isset($_FILES['dateiA'])) {
$addedA = get_date_time();
$fileNA = basename($_FILES['dateiA']['name']);
$fileSA = ($_FILES['dateiA']['size']);
$commentsA = "-fehlt noch-";
move_uploaded_file($_FILES['dateiA']['tmp_name'], 'h5up/'.$addedA.'_'.$owner.'_'.basename($_FILES['dateiA']['name']));
mysql_query ("INSERT INTO `ddufiles` (`id`, `owner`, `filename`, `size`, `added`, `comments` ) VALUES ('', '$owner', '$fileNA', '$fileSA', '$addedA', '$commentsA' )") or die(mysql_error());
}
if (isset($_FILES['dateiB'])) {
$addedB = get_date_time();
$fileNB = basename($_FILES['dateiB']['name']);
$fileSB = ($_FILES['dateiB']['size']);
$commentsB = "-nix-";
move_uploaded_file($_FILES['dateiB']['tmp_name'], 'h5up/'.$addedB.'_'.$owner.'_'.basename($_FILES['dateiB']['name']));
mysql_query ("INSERT INTO `ddufiles` (`id`, `owner`, `filename`, `size`, `added`, `comments` ) VALUES ('', '$owner', '$fileNB', '$fileSB', '$addedB', '$commentsB' )") or die(mysql_error());
}
/// usw ...
Alles anzeigen
Form und Post ist: (Styleelemente habe ich hier jetzt absichtlich weggelassen ...)
Ich weis, das ist nicht optimal die Teilfunktionen zu duplizieren um mehrere Uploadslots zu bekommen, aber anders hab ich es selber überhaupt nicht hinbekommen.
/// javascript ... ///
function uploadFiles() {
var fileA = document.getElementById("fileA").files[0];
var fileB = document.getElementById("fileB").files[0];
var fileC = document.getElementById("fileC").files[0];
var fileD = document.getElementById("fileD").files[0];
var formData = new FormData();
var progA = document.getElementById("progressA");
var progB = document.getElementById("progressB");
var progC = document.getElementById("progressC");
var progD = document.getElementById("progressD");
function onloadA(e) {
document.getElementById("prozentA").innerHTML = "100%";
progA.value = progA.max;
}
function onloadB(e) {
document.getElementById("prozentB").innerHTML = "100%";
progB.value = progB.max;
}
function onloadC(e) {
document.getElementById("prozentC").innerHTML = "100%";
progC.value = progC.max;
}
function onloadD(e) {
document.getElementById("prozentD").innerHTML = "100%";
progD.value = progD.max;
}
function onprogressA(e) {
var p = Math.round(100 / e.total * e.loaded);
document.getElementById("progressA").value = p;
document.getElementById("prozentA").innerHTML = p + "%";
};
function onprogressB(e) {
var p = Math.round(100 / e.total * e.loaded);
document.getElementById("progressB").value = p;
document.getElementById("prozentB").innerHTML = p + "%";
};
function onprogressC(e) {
var p = Math.round(100 / e.total * e.loaded);
document.getElementById("progressC").value = p;
document.getElementById("prozentC").innerHTML = p + "%";
};
function onprogressD(e) {
var p = Math.round(100 / e.total * e.loaded);
document.getElementById("progressD").value = p;
document.getElementById("prozentD").innerHTML = p + "%";
};
if (fileA) {
progA.value = 0;
progA.max = 100;
formData.append("dateiA", fileA);
clientA = new XMLHttpRequest();
clientA.onerror = onerror;
clientA.onload = onloadA;
clientA.upload.onprogress = onprogressA;
clientA.onabort = function (e) { alert("Upload abgebrochen"); };
clientA.open("POST", "ddup.php");
clientA.send(formData);
}
if (fileB) {
progB.value = 0;
progB.max = 100;
formData.append("dateiB", fileB);
clientB = new XMLHttpRequest();
clientB.onerror = onerror;
clientB.onload = onloadB;
clientB.upload.onprogress = onprogressB;
clientB.onabort = function (e) { alert("Upload abgebrochen"); };
clientB.open("POST", "ddup.php");
clientB.send(formData);
}
if (fileC) {
progC.value = 0;
progC.max = 100;
formData.append("dateiC", fileC);
clientC = new XMLHttpRequest();
clientC.onerror = onerror;
clientC.onload = onloadC;
clientC.upload.onprogress = onprogressC;
clientC.onabort = function (e) { alert("Upload abgebrochen"); };
clientC.open("POST", "ddup.php");
clientC.send(formData);
}
if (fileD) {
progD.value = 0;
progD.max = 100;
formData.append("dateiD", fileD);
clientD = new XMLHttpRequest();
clientD.onerror = onerror;
clientD.onload = onloadD;
clientD.upload.onprogress = onprogressD;
clientD.onabort = function (e) { alert("Upload abgebrochen"); };
clientD.open("POST", "ddup.php");
clientD.send(formData);
}
}
<form action="" method="post" enctype="multipart/form-data">
<input name="fileA" type="file" id="fileA" onchange="fileChangeA();" />
<div id="fileNameA"></div>
<div id="fileSizeA"></div>
<div id="fileTypeA"></div>
<progress id="progressA"></progress> <span id="prozentA"></span>
<input name="commentA" type="text" id="commentA" size="40">
... und so weiter ...
<input name="upload" value="Upload" type="button" onclick="uploadFiles();" />
</form>
Alles anzeigen