# PHP Upload Problem



## Consti (14. Mai 2004)

Hab mir einen relativ einfachen PHP Uploader aus dem Netz gezogen und ihn zuhause auf meinem Server installiert. Bin eigentlich auch ganz zu frieden. Kleine Bilder, Dokumente, etc. (Klein < ~2MB) klappen ohne Probleme. Falls ein Bild, etc. grösser als ca 2. MB wird, kommt eine Fehlermeldung, dabei ist es egal, ob es eine mp3 oder ein Bild ist.

Hier ist der Code, zur nähere erläuterung


```
<?php

$site_name = $_SERVER['HTTP_HOST'];
$url_dir = "http://www.consti-net.ipactive.de".$_SERVER[''].dirname($_SERVER['PHP_SELF']);
$url_this =  "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

$upload_dir = "files/";
$upload_url = $url_dir."/files/";
$message ="";

//create files directory if not exist
//If it does not work, create on your own and change permission.
if (!is_dir("files")) {
	die ("Das Verzeichnis Files exisitiert nicht");
}

if ($_FILES['userfile']) {
	$message = do_upload($upload_dir, $upload_url);
}
else {
	$message = "Ungültige Datei ausgewählt.";
}

print $message;

function do_upload($upload_dir, $upload_url) {

	$temp_name = $_FILES['userfile']['tmp_name'];
	$file_name = $_FILES['userfile']['name']; 
	$file_type = $_FILES['userfile']['type']; 
	$file_size = $_FILES['userfile']['size']; 
	$result    = $_FILES['userfile']['error'];
	$file_url  = $upload_url.$file_name;
	$file_path = $upload_dir.$file_name;

	//File Name Check
    if ( $file_name =="") { 
    	$message = "Ungültiger Dateiname";
    	return $message;
    }
    //File Size Check
    else if ( $file_size > 10485760) {
        $message = "Die Datei ist größer als 10 MB.";
        return $message;
    }

    $result  =  move_uploaded_file($temp_name, $file_path);
    $message = ($result)?"URL der Datei <a href=$file_url>$file_url</a>" :
    	      "Beim Hochladen der Datei ist ein Fehler aufgetreten.";

    return $message;
}
?>

<form name="upload" id="upload" ENCTYPE="multipart/form-data" method="post">
	Datei hochladen <input type="file" id="userfile" name="userfile">
<input type="submit" name="upload" value="Datei Hochladen">
</form>
```

Der Fehler kann meines Wissens nach nicht bei der Dateigrösse liegen. Ich habe 10 MB Extra mit einem Webumrechner in Bytes umgerechnet und dor eingetragen.
Dateiendungen sind dem Script eh egal.
Als Fehlermledung kommt dann

 "Beim Hochladen der Datei ist ein Fehler aufgetreten."

siehe auf Script!

Was kann ich machen, bzw. wo liegt der Fehler? Ich kann eigentlich kein PHP - doch ein paar Abläufe kann ich noch aus anderen Sprachen erkennen!
Würde mich über eine Antwort freuen!


----------



## Sven Petruschke (14. Mai 2004)

Das liegt daran, dass in der PHP.INI der Parameter upload_max_filesize standardmäßig auf 2 MB steht. Das sollter der primäre Grund für Dein Problem sein. 
Des Weiteren gibt es noch einen zweiten Parameter: post_max_size. Der steht standardmäßig auf 8MB. Solltest Du upload_max_file_size auf über 8 MB ändern, musst Du post_max_size auch erhöhen.

snuu


----------



## Consti (14. Mai 2004)

Danke, genau da wird der Fehler gelegen haben - jetzt geht alles...

War aber doch ein wenig kompliziert:

Hab den Server auf Win2000 laufen (ja sry, ich weiss... ) und hab minixampp genommen, da es am einfachsten war - nun gab es aber 2 php.ini - bis ich das mal rausgefunden habe, hats schon etwas gedauert 

Nun hab ich beide geänder - Anmerkung: es stand da 2M und 8M und nicht 2MB und 8MB) war ein wenig verwirrend, aber nun gehts!

Thx alot


----------



## Sven Petruschke (14. Mai 2004)

Die php.ini, die der Interpreter auf Windows-Systemen verwendet, ist die im Windows-Verzeichnis.


----------



## Consti (14. Mai 2004)

lol, naja, komisch, genau die hab ich nicht geändert - aber es klappt trotzdem, und werde sie dann nachträglich nicht mehr ändern, läuft ja alles


----------



## olly1882 (17. Dezember 2004)

Hallo,

ich habe mir den Code der Uploadfunktion (oben im ersten Post) kopiert und etwas verändert. Das funktioniert auch alles wunderbar.

Ich möchte jedoch den Dateinamen beim Upload in einen vorgegebenen ("security.sec") umbenennen. Kann mir einer sagen wo ich den Namen, unter dem die hochgeladene Datei gespeichert werden soll, ändern kann? Ich vermute es müsste hier 


```
$temp_name = $_FILES['userfile']['tmp_name'];
$file_name = $_FILES['userfile']['name'];
$file_type = $_FILES['userfile']['type'];
$file_size = $_FILES['userfile']['size'];
$result    = $_FILES['userfile']['error'];
$file_url  = $upload_url.$file_name;
$file_path = $upload_dir.$file_name;
```

geändert werden, aber ich versteh diesen Teil der Funktion nicht.


----------



## Jennifer Schieweck (19. Dezember 2004)

Hallo Olly-inno,

bei den zweiten Wert von move_uploaded_file Handelt es sich um den neuen Dateinamen und Pfad.
Da dies Vorher in der Variablie $file_path Definiert wird kanst du das da ändern.

Also wenn die Datei z.B. wie du gesagt hast als "security.sec" Gespeichert werden soll gibts du Einfach statt:

```
$file_path = $upload_dir.$file_name;
```
Den Dateinamen mit an den du haben willst:

```
$file_path = $upload_dir."security.sec";
```

mfg Andreas


----------



## olly1882 (21. Dezember 2004)

Danke Andreas!


----------



## olly1882 (23. März 2005)

Hallo zusammen,

ich habe jetzt das Uploadskript in einer Sessionverwaltung laufen. DIe Session wird dabei immer an den Pfad angefuegt, z.B. "http://172.16.103.12/dfm/homeAdmin.php?ID=6cc38c1ac0fcf8b59598c34c2c94990d".

Wie ich festgestellt habe, läuft das Uploadskript nicht mehr. Ich vermute mal, dass die Session auch hier mit angehängt werden muss.

$site_name = $_SERVER['HTTP_HOST']; 
			$url_dir = "http://172.16.103.12/DFM".$_SERVER[''].dirname($_SERVER['PHP_SELF']);
			$url_this = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

			$upload_dir = "upload/";
			$upload_url = $url_dir."/upload/";

Während ich bei den anderen Verlinkungen "."?ID=".$_GET[ID]" dahinter gehängt habe, funktioniert das hierbei nicht so richtig. Hat jemand ne Idee woran es liegen kann? Steht die Session vielleicht an der falschen Stelle?

MfG

Olly

PS: Plattform ist zwangsweise der IIS unter Win2003 Server mit PHP Version 4.x.


----------



## olly1882 (24. März 2005)

Hat niemand eine Idee?


----------



## olly1882 (24. März 2005)

Ich hab natürlich weiter probiert und herausgefunden, dass es doch nciht an dem oben geposteten Quellcode liegt. Das Problem liegt in der Datei an sich. Ich habe die Datei so weit gekärzt, bis nur noch das Gerüst der HTML-Ausgabe vorhanden ist. Jedoch funktioniert es immer noch nicht. Ich psote mal die verkürzte Version der Problemdatei udn eine funktionierende. Vielleicht fällt euch etwas auf.

Das Problemkind:

```
<?php
	require ("c:/hfm_verbindungen.inc.php");
	require ("./bottomLayout.inc.php");
	require ("./session.php");
	
	
	// Verbindung zur Datenbank aufbauen
	$cnx = $wdefsql;
	
	$group = "user";
	$sql = "SELECT usr FROM ses_session WHERE sessionID='$_GET[ID]';";
	$result = odbc_exec($cnx, $sql);
	while (odbc_fetch_row( $result )){
		$zahl = odbc_result($result, 1);
	}
	
	$sql = "SELECT grp FROM ses_user WHERE usr='$zahl';";
	$result = odbc_exec($cnx, $sql);
	while (odbc_fetch_row( $result )){
		$group = odbc_result($result, 1);
	}
	
	if ($group != ""){
		require ("./topLayoutAdmin.inc.php");
	} else {
		$user = "";
		require ("./topLayout.inc.php");
	}
	
	// topLayout ist das Menü auf der linken Seite und die Zeile ganz oben (mit Logo, ...)
	
	$IDeinfuegen = ".php?ID=".$_GET[ID];
	$topLayout = str_replace(".php", $IDeinfuegen, $topLayout);
	
	
	if ($user != "") {
		
		$status = "Dum di dum\n";
		
		echo $topLayout;
	?>
		<form name="upload" id="upload" ENCTYPE="multipart/form-data" action="<?php echo "$_SERVER[PHP_SELF]";?>" method="post">
			<br/>
			<table align="center" class="Table">
			<tr class="Text_Size_2">
				<td colspan="5" width="100%">Metadaten aus HFM einlesen</td>
			</tr>
	<?php
		/*	Hier wir der HTML-Teil erzeugt und in der Variable $string zwischengespeichert.
			Aus Platzgründen hab ich das mal gekürzt. Es gibt zwei Auswahlboxen und ein Textfeld.
			Dazu wird noch die Datei gewählt, die hochzuladen ist. Mit das Button "upload" soll
			der Upload starten.
		*/
		
		
		// Ende des Eingabebereichs
		$string .= "</table>";
		$string .= "</form>";
		
		
		// Ausgabe und Ende
		echo $string;
		echo $bottomLayout;
		odbc_close( $cnx);
	} else {
		echo "<br/>";
		echo "<div class='Text_Size_4'>";
			echo "Sie haben keine g&uuml;ltige Session-ID. Bitte loggen Sie sich erneut ein.";
			echo "<br/>";
			echo "<br/>";
			echo "Hier k&ouml;nnen Sie sich ";
			echo "<a href='./login.php'>";
				echo "erneut einloggen";
			echo "</a>";
		echo"</div>";
	}
?>
```


Die funktionierende Datei:

```
<?php
	require ("c:/hfm_verbindungen.inc.php");
	require ("./bottomLayout.inc.php");
	require ("./session.php");
	
	
	// Verbindung zur Datenbank aufbauen
	$cnx = $wdefsql;
	
	$group = "user";
	$sql = "SELECT usr FROM ses_session WHERE sessionID='$_GET[ID]';";
	$result = odbc_exec($cnx, $sql);
	while (odbc_fetch_row( $result )){
		$zahl = odbc_result($result, 1);
	}
	
	$sql = "SELECT grp FROM ses_user WHERE usr='$zahl';";
	$result = odbc_exec($cnx, $sql);
	while (odbc_fetch_row( $result )){
		$group = odbc_result($result, 1);
	}
	
	if ($group != ""){
		require ("./topLayoutAdmin.inc.php");
	} else {
		$user = "";
	}
	
	
	$IDeinfuegen=".php?ID=".$_GET[ID];
	$topLayout=str_replace(".php", $IDeinfuegen, $topLayout);
	
	
	if ($user != "") {
		
		// gekürzt!
		
		//Beginn des Eingabebereichs
		echo $topLayout;
	?>
		<form name="wdef" action="<?php echo "$_SERVER[PHP_SELF]?ID=$ID";?>" method="post">
			<br/>
			<table align="center" class="Table">
			<tr class="Text_Size_2">
				<td colspan="5" width="100%">WDEF und Security</td>
			</tr>
	<?php
		// Wie in der ersten Datei, ein einfacher Seitenaufbau in tabellarischer Form
		
		
		// Ende des Eingabebereichs
		$string .= "</table>";
		$string .= "</form>";
		
		
		// Ausgabe und Ende
		echo $string;
		echo $bottomLayout;
		odbc_close( $cnx);
	} else {
		echo "<br/>";
		echo "<div class='Text_Size_4'>";
			echo "Sie haben keine g&uuml;ltige Session-ID. Bitte loggen Sie sich erneut ein.";
			echo "<br/>";
			echo "<br/>";
			echo "Hier k&ouml;nnen Sie sich ";
			echo "<a href='./login.php'>";
				echo "erneut einloggen";
			echo "</a>";
		echo"</div>";
	}
?>
```


----------

