Otto Normalverbraucher: Deit upload

Hallo Ihr Profis,

ich möchte eine CSV Datei aussuchen, hochladen und dann verarbeiten.

Das ist mein Versuch:

<? php
if($_GET[action]){
	//phpinfo(INFO_VARIABLES);

	$dateiName = "import.csv";
	$upload = $_POST[dateiName];
	echo $upload . "<br>";

		if(move_uploaded_file ( $upload , $dateiName )){
			echo "bin da<br>";
			$fp = fopen($dateiName,"r");

			while($line = fgetcsv($fp,3000,";")){
				echo "Paketnr: " . $line[15] . "<br> Lieferschein: " . $line[23] . "<br> Gewicht: " . $line[21] . "<hr>";
			}
		}
	} else {
?>
	<form name="DDimport" style="margin:20px;" action="ddImport.php?action= 1" method="post">

		<br>Importdatei wählen<br><br>
		<input type='file' name = 'dateiName' value= ' Durchsuchen ' align="absmiddle" accept="text/csv"><br>
		<input type='submit' value= 'importieren ' align="absmiddle" >
		</br>

	</form>

<? } ?>

Die echos dienen rein zur Überwachung wie weit das Programm arbeitet. Das erste echo zeigt den Dateinamen an - dann ist schluß. Bei if(move_upload ist schluss.

Wo hat er denn die Datei hingeladen? Da ist doch nirgends ein Pfad angegeben? Dann muss die Datei doch im selben Pfad liegen wie das Skript? Auch der phpinfo zeigt keinen Pfad in dem die Datei liegen könnte.

Wo ist mein Denkfehler?

  1. Hallo Otto,

    vorweg: es ist fehlerhaft und wird vom PHP Interpreter auch mit Meldungen quittiert, wenn man benannte Schlüssel für Arrays nicht in Anführungszeichen setzt. Man schreibt $_GET['action'] und $_POST['dateiname']. Es mag sein, dass man reichlich Beispiele findet, die die Anführungszeichen weglassen, aber das macht die Sache nicht richtiger.

    Zum Thema: Du darfst nicht $_POST['dateiname'] als Parameter für move_uploaded_file verwenden, das geht anders.

    Eine ausführliche Beschreibung steht hier im PHP Handbuch. Studiere das mal zunächst.

    Rolf

    --
    sumpsi - posui - obstruxi
  2. Hallo,

    <? php
    if($_GET[action]){
    	//phpinfo(INFO_VARIABLES);
    
    	$dateiName = "import.csv";
    	$upload = $_POST[dateiName];
    	echo $upload . "<br>";
    
    		if(move_uploaded_file ( $upload , $dateiName )){
    			echo "bin da<br>";
    			$fp = fopen($dateiName,"r");
    
    			while($line = fgetcsv($fp,3000,";")){
    				echo "Paketnr: " . $line[15] . "<br> Lieferschein: " . $line[23] . "<br> Gewicht: " . $line[21] . "<hr>";
    			}
    		}
    	} else {
    ?>
    	<form name="DDimport" style="margin:20px;" action="ddImport.php?action= 1" method="post">
    
    		<br>Importdatei wählen<br><br>
    		<input type='file' name = 'dateiName' value= ' Durchsuchen ' align="absmiddle" accept="text/csv"><br>
    		<input type='submit' value= 'importieren ' align="absmiddle" >
    		</br>
    
    	</form>
    
    <? } ?>
    

    Wo ist mein Denkfehler?

    zusätzlich zu den Fehlern, die Rolf schon angesprochen hat: Eine gemischte Parameter-Übergabe (also teils per GET, teils per POST) ist zwar nicht per se verboten, aber nicht empfehlenswert, weil man so leicht den Überblick verliert. Besser ist es, den Parameter action in ein Hidden-Input zu legen und dann ebenfalls mit dem POST-Datenblock zu versenden (und auch als $_POST['action'] abzufragen).

    Da die Upload-Daten nicht im $_POST-Array an PHP übermittelt werden, sondern in $_FILES, geht auch dein Zugriff auf $_POST['dateiName'] ins Leere und wirft eine Notice. Du hast doch während der Entwicklung hoffentlich das error_reporting auf E_ALL stehen?

    Grundsätzlich wird eine hochgeladene Datei beim File-Upload im Temp-Verzeichnis des Servers abgelegt. Wo das genau ist, muss man als Script-Programmierer nicht wissen; move_uploaded_file() weiß es, wenn man die Datei dann an ihren endgültigen Ort verschiebt.

    Live long and pros healthy,
     Martin

    --
    Paradox: Wieso heißen die Dinger Kühlkörper, obwohl sie höllisch heiß werden?
    $upload = $_POST[dateiName];
    

    Selbst wenn das NOCH funktioniert, dann wird es das bald nicht mehr tun:

    PHP Warning: Use of undefined constant dateiName - assumed 'dateiName' (this will throw an Error in a future version of PHP) in Standard input code on line 1

    if(move_uploaded_file ( $upload , $dateiName )){
    

    Wie wird denn Deine Datei hoch geladen? Als Dateiupload oder als Text in einem Input bzw. einer Textarea?

    Im Einzelnen:

    Ein HTML-Formular zum Upload der Datei könnte so aussehen:

    <form action="upload.php" method="post" enctype="multipart/form-data">
      <label>Datei wählen: <input type="file" name="file"></label>
      <button>senden</button>
    </form>
    

    Dann würdest Du mit

    <pre><php print_r( $_FILES )
    

    etwa folgende Informationen sehen:

    $_FILES ausgewertet

    • In $_FILES['file']['tmp_name'] stände der Speicherort der empfangenen Datei.

    • In $_FILES['file']['size'] die Menge der enthaltenen Bytes.

    • In $_FILES['file']['error'] die Information, ob es einen Fehler gab.

    Zur Auswertung:

    #Prüfe auf Fehler und Größe:
    if ( ! $_FILES['file']['error'] ) {
       # Wozu kopieren?
       $fp = fopen( $_FILES['file']['tmp_name'], "r" );
       # Hier glaub ich Dir mal Einiges. nehme aber PHP_INT_MAX als maximale Länge:
       while( $line = fgetcsv( $fp, PHP_INT_MAX , ';' ) ) {
    			echo 'Paketnr: ' , htmlspecialchars( $line[15] ),
               '<br>Lieferschein: ' , htmlspecialchars( $line[23] )'
               '<br> Gewicht: ' , htmlspecialchars( $line[21] ), '<hr>';
       }
    }
    
    1. Falls Du $_FILES['file']['error'] auswerten willst, hilft Dir folgende Tabelle:

      0 == UPLOAD_ERR_OK
      1 == UPLOAD_ERR_INI_SIZE
      2 == UPLOAD_ERR_FORM_SIZE
      3 == UPLOAD_ERR_PARTIAL
      4 == UPLOAD_ERR_NO_FILE
      6 == UPLOAD_ERR_NO_TMP_DIR
      7 == UPLOAD_ERR_CANT_WRITE
      8 == UPLOAD_ERR_EXTENSION
      

      Rechts sind Konstanten, welche im Namen den Fehler beschreiben. Es ist möglich, dass von PHP-Version womöglich andere (weitere) Fehler definiert sind.

      echo '<?php print_r(get_defined_constants());' | php | grep -i '\[UPLOAD_
      

      in einem Linux-Terminal (und das Handbuch) hilft Dir (bei installiertem PHP-cli) da weiter.

      1. echo '<?php print_r(get_defined_constants());' | php | grep -i '\[UPLOAD_'
        

        natürlich...