Extrem verschachteltes $_FILES-Array

nietaL

NGBler
Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
Hey Leute,

beim Absenden eines Upload-Formulars erhalte ich ein $_FILES-Array, das nicht ganz meinen Erwartungen entspricht. Darüber hinaus ist es unvollständig.

[src=php]<?php
if(isset($_POST['submit'])){

// Count total files
$countfiles = count($_FILES['file']['name']);

// Looping all files
for($i=0;$i<$countfiles;$i++){
$filename = $_FILES['file']['name'][$i];

// Upload file
move_uploaded_file($_FILES['file']['tmp_name'][$i],'upload/'.$filename);

}
}
?>
<form method='post' action='' enctype='multipart/form-data'>
<input type="file" name="file[]" id="file" multiple>

<input type='submit' name='submit' value='Upload'>
</form>[/src]

Ergebnis:
Array ( [file] => Array ( [name] => Array ( [0] => ende.png ) [type] => Array ( [0] => ) [tmp_name] => Array ( [0] => ) [error] => Array ( [0] => 6 ) [size] => Array ( [0] => 0 ) ) )

Ich habe weniger Verschachtelung und mehr Dateiinfo erwartet. Typ und Grße wird nicht ermittelt. Und alle Werte sind unntigerweise noch einmal alleine in einem eigenen Array. Woran knnte das liegen?
 
Du hast da den Error Code 6 in "Error", der lautet wie folgt:

UPLOAD_ERR_NO_TMP_DIR
Value: 6; Missing a temporary folder.

Hier steht auch noch etwas dazu:

Meine Annahme daher wäre, dass dein temporäres Verzeichnis nicht durch den PHP beschreibbar ist.

upload_tmp_dir

The temporary directory used for storing files when doing file upload. Must be writable by whatever user PHP is running as. If not specified PHP will use the system's default.

If the directory specified here is not writable, PHP falls back to the system default temporary directory. If open_basedir is on, then the system default directory must be allowed for an upload to succeed.

Edit: Und hier:
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #3
Danke für deine Antwort. Ich habe jetzt mehrere Sachen versucht:
1. Einen Ordner "tmp" im root angelegt, wo auch das Upload-Skript liegt.
2. Php.ini-Datei gesucht, deren Pfad mir im Kopf der Übersicht verraten wurde, die ich über php_info(); aufrufen kann. Ich habe direkt darin den upload_tmp_dir geändert mit dem Wert /tmp. Seltsamerweise wird diese und auch andere Änderungen nicht nach per php_info(); angezeigt. Es bleibt alles unverändert.
3. Bei Plesk in den php-Einstellungen am Seitenende unter Zusätzliche Konfigurationsanweisungen folgendes eingegeben: upload_tmp_dir = /tmp

Als ich nach open_basedir suchte fand ich folgendes an folgenden Punkten:
A) auf der Einstellungsübersicht von Plesk/PHP folgenden Eintrag: {WEBSPACEROOT}{/}{;}{TMP}{/}
B) Ausgabe über php_info();: C:/Inetpub/vhosts/xxx.de\;C:\Windows\Temp\
C) php.ini-Datei, auf die sich (B) angeblich bezieht: ;open_basedir = (also auskommentiert)

Ich raff das nicht.

Es kommt immer zum selben Fehler 6


Edit:
[13-Dec-2020 21:24:36 UTC] PHP Warning: Unknown: open_basedir restriction in effect. File(C:\Users\IWPD_1~1\AppData\Local\Temp) is not within the allowed path(s): (C:/Inetpub/vhosts/xxx.de\;C:\Windows\Temp\) in Unknown on line 0
[13-Dec-2020 21:24:36 UTC] PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0

Edit 2:
Wenn ich open_basedir ausschalte, geht es. Aber das kann wohl nicht die Lsung sein.
 
Zuletzt bearbeitet:
Under Windows, separate the directories with a semicolon. On all other systems, separate the directories with a colon.


Richtiges OS für Semikolon? Tausch mal die Reihenfolge, dann siehst du, ob er beide Pfade matched.
Vllt mal das Originalfile auszugsweise hier rein stellen, nicht nur so Stichworte.
 
2. Php.ini-Datei gesucht, deren Pfad mir im Kopf der Übersicht verraten wurde, die ich über php_info(); aufrufen kann. Ich habe direkt darin den upload_tmp_dir geändert mit dem Wert /tmp. Seltsamerweise wird diese und auch andere Änderungen nicht nach per php_info(); angezeigt. Es bleibt alles unverändert.
Meine Vermutung geht in dieselbe Richtung wie die von BurnerR, nur andersrum:
Sicher, dass /tmp fuer dein OS passt? Die Fehlermeldungen und die Konfiguration schauen stark nach Windows aus.
Da waere dann eher upload_tmp_dir=C:\Windows\Temp\ passend (oder ein anderes Verzeichnis, das schreibbar und in open_basedir ist).
 
  • Thread Starter Thread Starter
  • #6
Danke soweit für die Hinweise. Der Webseite läuft auf einer Windows VM. Deshalb verwendete ich auch ein Semikolon. Die Array-Verschachtelung hing mit dem multiple zusammen. Da ich immer nur eine hochladen muss, konnte ich das soweit reduzieren.

Ich habe open_basedir erst einmal auf NONE gelassen, um zu sehen, ob da noch mehr krudes Zeug auf mich zu kommt. Und ja, da stimmt noch mehr nicht: Folgendes Skript liefert nun folgendes zurück:

[src=php]
if(isset($_POST['submit']))
{

print_r($_FILES);

$filename = $_FILES['file']['size'][$i];
if(array_key_exists('file', $_FILES))
{
if ($_FILES['file']['error'] === UPLOAD_ERR_OK)
{
echo 'upload was successful<br>';

if(move_uploaded_file($_FILES['file']['tmp_name'][$i],'uploads/'.$filename))
{
echo "really successful<br>";
}
else
{
echo "actually not<br>";
}
}
else
{
die("Upload failed with error code " . $_FILES['file']['error']);
}
}
}


?>
<form method='post' action='' enctype="multipart/form-data">
<input type="file" name="file" id="file">

<input type='submit' name='submit' value='Upload'>
</form>

[/src]

Array ( [file] => Array ( [name] => ende.png [type] => image/png [tmp_name] => C:\Users\IWPD_1(***)\AppData\Local\Temp\php4643.tmp [error] => 0 [size] => 5573 ) )
upload was successful
actually not
 
Zuletzt bearbeitet:
Die Ausgabe stimmt, aber hast du auch Berechtigungen gesetzt bzw. Existiert der "uploads" Folder den du angegeben hast?

Es gibt da zwei Problemstellen. Aus der Dokumentation:
Return Values

Returns true on success.

If filename is not a valid upload file, then no action will occur, and move_uploaded_file() will return false.

If filename is a valid upload file, but cannot be moved for some reason, no action will occur, and move_uploaded_file() will return false. Additionally, a warning will be issued.

 
Zurück
Oben