Guten Abend,
ich habe mal wieder ein Problem mit PHP. Und zwar bin ich gerade dabei ein kleines FTP-Tool zu bauen.
Folgendermaßen ist es aufgebaut:
1. File-Upload-Form wird ausgefüllt und abgesendet
2. Überprüfung und Validierung der Dateien
3. Speicherung der Dateien
4. Wenn Fehler aufgetreten sind, wird eine Übersichtstabelle erstellt inkl. zwei Buttons, um auszuwählen, wie es weitergehen soll. (Alle, die hochladbar sind, hochladen oder Ausgewählte hochladen)
5. Klick auf "Alle hochladen", per Post und hidden-Feld werden hochladbare Dateien übergeben
6. Dateien werden nochmals hochgeladen
Das Problem, dass ich habe, befindet sich bei Schritt 6. Nämlich können die Dateien aus irgendeinem Grund nicht hochgeladen werden. Da move_uploaded_file false zurückgibt und alle Parameter richtig sind, liegt es vermutlich daran, dass ja der tmp_file nach dem erneuten Request nicht mehr existiert oder etwas ähnliches.
Ich habe bereits versucht da entgegenzuwirken und nach dem zweiten Request einfach ein neuen tmp_file erstellt, aber irgendwie scheint das auch nicht zu funktionieren.
Wahrscheinlich liegt das Problem also doch woanders. Daran, dass der Superglobal $_FILES leer ist, liegt es ebenfalls nicht, da eine Füllung von diesem, auch kein positives Ergebnis mit sich bringt.
Letztendlich vermute ich jetzt, dass der File-Upload nur gelingen kann, wenn PHP die Daten über das File-Upload-Formular bekommt und nicht über diese Umwege.
Wenn meine Vermutung richtig liegt, würde mich interessieren, ob ich das irgendwie umgehen kann. Falls es das nicht ist, wäre es natürlich super, wenn jemand den eigentlichen Grund weiß.
Bin mit meinem Wissen gerade echt etwas am Limit.
Hier ist der Code:
ftp-tool.php
<?php
require_once('config.php');
require_once('functions.php');
if (!empty($_POST['upload-again'])) {
if ($_POST['upload-again'] == 'Alle Dateien hochladen') {
echo 'Alle Dateien hochladen';
/*echo '<pre>';
print_r($_FILES);
echo '</pre>';*/
$userfiles = $_POST['userfiles'];
/*foreach ($userfiles as $key => $userfile) {
$tmp_files[$key] = tempnam(sys_get_temp_dir(), 'php');
$userfiles[$key]['tmp_name'] = $tmp_files[$key];
}
$_FILES = $userfiles;
echo '<pre>';
print_r($userfiles);
print_r($_FILES);
echo '</pre>';*/
$reupload = true;
} else {
echo 'Ausgewählte Dateien hochladen';
}
}
if ($_POST['submit-button'] == 'Hochladen' || $reupload) {
if (!$reupload) {
$userfiles = reorderArray($_FILES['files']);
$userfiles[0]['error'] = 4;
}
$doFilesExist = existFiles($userfiles);
if ($doFilesExist && !is_array($doFilesExist)) {
// Dateien vorhanden
$areFilesUploaded = areFilesUploaded($userfiles);
if ($areFilesUploaded && !is_array($areFilesUploaded)) {
// Upload erfolgreich
foreach ($userfiles as $key => $userfile) {
$userfiles[$key]['name'] = cleanFileName($userfiles[$key]['name']);
}
$uploadedFiles = scandir(DIR);
$areFilesAvailable = areFilesAvailable($userfiles, $uploadedFiles);
if (!$areFilesAvailable && !is_array($areFilesAvailable)) {
// Dateien noch nicht verfügbar
$areFilesSaved = uploadFiles($userfiles);
if ($areFilesSaved && !is_array($areFilesSaved)) {
// Dateien erfolgreich gespeichert
$error = '<p><strong>Datei/en wurden erfolgreich hochgeladen!</strong></p>';
$error .= createFileStatusTable($userfiles, $areFilesSaved, 'erfolgreich gespeichert', 'nicht gespeichert');
} else {
$initialUserfiles = $userfiles;
//print_r($areFilesSaved);
if (is_array($areFilesSaved)) {
foreach ($areFilesSaved as $key => $value) {
if ($value === 'false') {
unset($userfiles[$key]);
}
}
}
if (empty($userfiles)) {
// Speichern komplett gescheitert
$error = '<p><strong>Datei/en konnte/n nicht gespeichert werden. Bitte versuchen Sie es noch mal oder <a href="#">kontaktieren Sie den Webmaster</a>, falls Sie es für eine Fehlfunktion halten. Vielen Dank für Ihr Verständnis!</strong></p>';
} else {
// (Teilweise) erfolgreich gespeichert
$error = createFileStatusTable($initialUserfiles, $areFilesUploaded, 'erfolgreich gespeichert', 'nicht gespeichert');
}
}
} else {
// Dateien bereits verfügbar
$initialUserfiles = $userfiles;
if ($areFilesAvailable && !is_array($areFilesAvailable)) {
for ($i=0; $i < count($initialUserfiles); $i++) {
unset($userfiles[$i]);
}
}
if (empty($userfiles)) {
// Alle Dateien bereits verfügbar
$error = '<p><strong>Alle Dateien sind bereits verfügbar und werden nicht gespeichert.</strong></p>';
} else {
// Manche/keine Dateien bereits verfügbar
$error = createFileStatusTable($initialUserfiles, $areFilesAvailable, 'bereits verfügbar', 'noch nicht verfügbar');
}
}
} else {
// Fehler beim Hochladen
$initialUserfiles = $userfiles;
if (is_array($areFilesUploaded)) {
foreach ($areFilesUploaded as $key => $value) {
if ($value === 'false') {
unset($userfiles[$key]);
}
}
}
if (empty($userfiles)) {
// Hochladen komplett gescheitert
$error = '<p><strong>Beim Hochladen ist ein Fehler aufgetreten. Bitte versuchen Sie es noch mal.</strong></p>';
} else {
// (Teilweise) erfolgreich hochgeladen
$error = createFileStatusTable($initialUserfiles, $areFilesUploaded, 'hochgeladen', 'nicht hochgeladen');
}
}
} else {
// Fehler bei Auswahl der Dateien
$initialUserfiles = $userfiles;
if (is_array($doFilesExist)) {
foreach ($doFilesExist as $key => $value) {
if ($value === 'false') {
unset($userfiles[$key]);
}
}
}
if (empty($userfiles)) {
// Keine Dateien vorhanden
$error = '<p><strong>Sie haben keine Datei/en ausgewählt. Bitte korrigieren Sie dies.</strong></p>';
} else {
// Dateien (teilweise) vorhanden
$error = createFileStatusTable($initialUserfiles, $doFilesExist, 'erkannt', 'unerkannt/fehlerhaft');
$upload_again_form = '<form action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '" method="post">';
// Erstellung der input-hidden-Felder für die Userfiles (4 pro Userfile)
foreach ($userfiles as $key => $userfile) {
foreach ($userfile as $key2 => $value) {
$upload_again_form .= '<input type="hidden" name="userfiles[' . $key . '][' . $key2 . ']" value="' . $userfile[$key2] . '">';
}
}
$upload_again_form .=
'<input type="submit" name="upload-again" value="Alle Dateien hochladen">
<input type="submit" name="upload-again" value="Ausgewählte Dateien hochladen">
</form>
';
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FTP-Tool</title>
</head>
<body>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post" enctype="multipart/form-data">
<label>Datei/en: <input type="file" name="files[]" multiple="multiple"></label>
<input type="submit" name="submit-button" value="Hochladen">
<?php echo $error; ?>
</form>
<?php echo $upload_again_form; ?>
</body>
</html>
Alles anzeigen
functions.php
<?php
function cleanFileName($filename) {
$filename = strtolower($filename);
$filename = str_replace('"', "-", $filename);
$filename = str_replace("'", "-", $filename);
$filename = str_replace("*", "-", $filename);
$filename = str_replace("ß", "ss", $filename);
$filename = str_replace("ß", "ss", $filename);
$filename = str_replace("ä", "ae", $filename);
$filename = str_replace("ä", "ae", $filename);
$filename = str_replace("ö", "oe", $filename);
$filename = str_replace("ö", "oe", $filename);
$filename = str_replace("ü", "ue", $filename);
$filename = str_replace("ü", "ue", $filename);
$filename = str_replace("Ä", "ae", $filename);
$filename = str_replace("Ö", "oe", $filename);
$filename = str_replace("Ü", "ue", $filename);
$filename = htmlentities($filename);
$filename = str_replace("&", "und", $filename);
$filename = str_replace("+", "und", $filename);
$filename = str_replace("(", "-", $filename);
$filename = str_replace(")", "-", $filename);
$filename = str_replace(" ", "-", $filename);
$filename = str_replace("\'", "-", $filename);
$filename = str_replace("/", "-", $filename);
$filename = str_replace("?", "-", $filename);
$filename = str_replace("!", "-", $filename);
$filename = str_replace(":", "-", $filename);
$filename = str_replace(";", "-", $filename);
$filename = str_replace(",", "-", $filename);
$filename = str_replace("--", "-", $filename);
$filename = filter_var($filename, FILTER_SANITIZE_URL);
return($filename);
}
function reorderArray($array) {
foreach ($array as $key => $value) {
foreach ($array[$key] as $key2 => $value2) {
$reorderedArray[$key2][$key] = $value2;
}
}
return $reorderedArray;
}
function existFiles($files) {
$existingFiles = 0;
foreach ($files as $key => $file) {
if ($files[$key]['error'] != 4) {
$doFilesExist[$key] = true;
$existingFiles++;
} else {
$doFilesExist[$key] = 'false';
}
}
if ($existingFiles == count($files)) {
return true;
} else {
return $doFilesExist;
}
}
function areFilesUploaded($files) {
$uploadedFiles = 0;
foreach ($files as $key => $file) {
if ($files[$key]['error'] == 0) {
$areFilesUploaded[$key] = true;
$uploadedFiles++;
} else {
$areFilesUploaded[$key] = 'false';
}
}
if ($uploadedFiles == count($files)) {
return true;
} else {
return $areFilesUploaded;
}
}
function areFilesAvailable($files, $uploadedFiles) {
$availableFiles = 0;
foreach ($files as $key => $file) {
if (in_array($files[$key]['name'], $uploadedFiles)) {
$areFilesAvailable[$key] = true;
$availableFiles++;
} else {
$areFilesAvailable[$key] = 'false';
}
}
if ($availableFiles == count($files)) {
return true;
} else if ($availableFiles > 0) {
return $areFilesAvailable;
} else {
return false;
}
}
function uploadFiles($files) {
$savedFiles = 0;
foreach ($files as $key => $file) {
$areFilesSaved[$key] = move_uploaded_file($files[$key]['tmp_name'], 'uploads/' . $files[$key]['name']);
//var_dump($areFilesSaved[$key]);
if ($areFilesSaved[$key]) {
$areFilesSaved[$key] = true;
$savedFiles++;
} else {
$areFilesSaved[$key] = 'false';
}
}
if ($savedFiles == count($files)) {
return true;
} else {
return $areFilesSaved;
}
}
function createFileStatusTable($initialFiles, $filestatus, $succesStatus, $unsuccesStatus) {
$table = '<table>
<tr>
<th>Hochladen?</th>
<th>Datei</th>
<th>Status</th>
</tr>
';
for ($i=0; $i < count($initialFiles); $i++) {
$table .= '<tr>
<td><input type="checkbox" value="' . $i . '"></td>
<td>' . $initialFiles[$i]['name'] . '</td>
';
if ($filestatus[$i] == 1 || $filestatus == 1) {
$table .= '<td>' . $succesStatus . '</td>';
} else {
$table .= '<td>' . $unsuccesStatus . '</td>';
}
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
?>
Alles anzeigen
Schon mal danke im Voraus.
Gruß
JR Cologne