Datei Upload-Abfrage

Fruitgum

Erfahrenes Mitglied
Hallo,

nach dem ich eine Datei mit PHP über ein UploadScript hochgeladen habe, möchte ich sie gern weiter verarbeiten. Dafür habe ich ein Link gebaut, der die Datei dann in meine MySql Datenbank einträgt. Leider habe ich festgestellt, dass man den Link für das eintragen in die Datenbank schneller drücken kann als die Datei Hochgeladen ist. Und dann bricht der vorgang ab und ich muss von vorn starten.


PHP:
<?php


if (isset($_FILES["datei"])) {
if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK) 
$regExp = "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";

// Dateiname und Dateigröße
if (preg_match($regExp,$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > 0 && $_FILES["datei"]["size"] < 100000) {

// Temporäre Datei in das Zielverzeichnis
// des Servers verschieben.
move_uploaded_file($_FILES["datei"]["tmp_name"],"csv/".$_FILES["datei"]["name"]);

readfile("status.html"); 
}
else {
  echo "Fehler: Im Dateinamen oder Dateigrössen Limit!";
}
}
else {
  echo "Fehler: Während der Übertragung aufgetreten!";
}
}
else {
  echo "Fehler: Dateiupload fehlgeschlagen!";
}

?>

Wie kann ich das so machen, das er erst zu status.html verlink wenn die Datei wirklich oben ist?


LG, Fruit :suspekt:
 
Also Moment mal, dein Script wird doch erst aufgerufen, wenn die Datei schon auf dem Server ist. Und die Zeile, wo die status.html geladen wird, wird auch erst abgearbeitet nachdem die Datei vom temp-Verzeichnis ins Zielverzeichnis kopiert wurde. Der klickbare Link in der status.html kann nicht erscheinen, bevor die Datei komplett hochgeladen ist.

BTW: Warum machst du einen extra Link zum in die Datenbank eintragen, und kopierst nicht einfach den Code fürs Eintragen in die DB hinter den move_uploaded_file() Befehl!?

Gute Nacht ;)
 
In der status.html wird gesagt ob er erfolgreich hochgeladen hat. das möchte ich schon so lassen.

hier status.html:

PHP:
<html>
<head>
<title>Dateiupload – Erfolgreich</title>
</head>
<body><center>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Arial, Helvetica, sans-serif" size="6">Datei erfolgreich Hochgeladen!</font></p>
<p>&nbsp;</p>
<p><font face="Arial, Helvetica, sans-serif"><a href="eintragen.php">[CSV-Datei jetzt in die Datenbank schreiben]</a></font></p>
</center>
</body>
</html>

Aber es passiert manchmal wenn ich den Eintragenlink drücke, das es nicht fuktioniert und er die datei nicht findet, obwhol sie oben ist? Sollte ich vielleicht die eintragen.php anders aufrufen?

hier nochmal meine eintragen.pnp:

PHP:
include "config_sense.php";

mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], 
$db_Password[$select_db]) || 
die("Keine Verbindung zur Datenbank möglich: ".mysql_error());
            mysql_select_db($db_Database[$select_db]);

$fp = fopen ("csv/tx_cal.csv","r");


$sql2 = 
'LOAD DATA LOCAL INFILE \'csv/tx_cal.csv\' 
REPLACE INTO TABLE `tx_cal_event` 
FIELDS TERMINATED BY \';\' 
ENCLOSED BY \'"\' 
ESCAPED BY \'\\\\\' 
LINES TERMINATED BY \'\\r\\n\'';
           
		    $result = mysql_query($sql2);
            echo  mysql_error();
            echo "<br>";
			echo "<br>";
			echo "<center>";
			echo "Einträge wurden hinzugefügt bzw. ersetzt: ",$result; 
            echo "</center>";

$dateiname="csv/tx_cal.csv";
unlink($dateiname);
echo "<br>";
echo "<br>";
echo "<center>";
echo "tx_cal.csv wurde gelöscht";
echo "</center>";

Ja...
 
Also wenn er sagt, dass er die Datei nicht findet, liegt das bestimmt nicht daran, dass er die Datei NOCH NICHT, sondern schlichtweg ÜBERHAUPT NICHT hochgeladen hat. zumindest nicht unter dem Namen "tx_cal.csv". Um sicherzugehen, dass die Datei unter diesem Namen gespeichert wird, würde ich den Namen explizit angeben.
Um zu überprüfen, ob das mit dem Moven überhaupt geklappt hat, würde ich noch eine Abfrage einbauen:
PHP:
if(move_uploaded_file($_FILES["datei"]["tmp_name"],"csv/tx_cal.csv");) {
    readfile("status.html");
} else {
    echo "Fehler: Datei konnte nicht kopiert werden!"; 
}
So verringert sich schon mal die Fehlerquelle.
 
Thx...

wo bau ich den Code dazwischen?

die upload sieht so aus:
PHP:
<?php


if (isset($_FILES["datei"])) {
if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK) 
$regExp = "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";

// Dateiname und Dateigröße
if (preg_match($regExp,$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > 0 && $_FILES["datei"]["size"] < 100000) {

// Temporäre Datei in das Zielverzeichnis
// des Servers verschieben.
move_uploaded_file($_FILES["datei"]["tmp_name"],"csv/".$_FILES["datei"]["name"]);

readfile("status.html");
} else { 
    echo "Fehler: Datei konnte nicht kopiert werden!";  
}  
}
else {
  echo "Fehler: Im Dateinamen oder Dateigrössen Limit!";
}
}
else {
  echo "Fehler: Während der Übertragung aufgetreten!";
}
}
else {
  echo "Fehler: Dateiupload fehlgeschlagen!";
}

?>


Und wie kann ich es so machen das der name der CSV egal ist und nur die Endung stimmt.


PHP:
'LOAD DATA LOCAL INFILE \'csv/tx_cal.csv\'  
REPLACE INTO TABLE `tx_cal_event`  
FIELDS TERMINATED BY \';\'  
ENCLOSED BY \'"\'  
ESCAPED BY \'\\\\\'  
LINES TERMINATED BY \'\\r\\n\'';

Nach INFILE steht ja noch mal die Datei. Ich schaffe es dort nicht, die Datei als Vaiable einzusetzen. ?

Ich habe hier nur das PHP-Taschenbuch, das hilft mir nicht gerade weiter. ;)
 
Zuletzt bearbeitet:
Hehe.. N Data Becker Buch oder wie? ;)

Das Eintragen Script kennt die Datei ja gar nicht. Das heisst du müsstest die noch übergeben durch den Link:

Upload-Script:
PHP:
<?php

if (isset($_FILES["datei"])) {

    if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK) { //hier fehlte noch die {

        $regExp = "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";

        if (preg_match($regExp,$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > 0 && $_FILES["datei"]["size"] < 100000) {

            //hier halt wieder dynamisch und nicht statisch, wie ich es vorgeschlagen hatte           
            if(move_uploaded_file($_FILES["datei"]["tmp_name"],"csv/".$_FILES["datei"]["name"])) {
                //readfile("status.html");
                include("header.php"); //dadurch wird der code der datei hier einfach "hinkopiert" und die datei kennt auch die variable $_FILES, was durch readfile nicht gegeben wäre
            } else {
                echo "Fehler: Datei konnte nicht kopiert werden!"; 
            } 

        } else {
            echo "Fehler: Im Dateinamen oder Dateigrössen Limit!";
        }

    } else {
        echo "Fehler: Während der Übertragung aufgetreten!";
    }

} else {
    echo "Fehler: Dateiupload fehlgeschlagen!";
}

?>

header.php (nicht mehr header.html, weil die html keine php-Variablen verarbeiten kann, da sie nicht durch den php-compiler geht):
PHP:
<html>
<head>
<title>Dateiupload – Erfolgreich</title>
</head>
<body><center>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Arial, Helvetica, sans-serif" size="6">Datei erfolgreich Hochgeladen!</font></p>
<p>&nbsp;</p>
<p><font face="Arial, Helvetica, sans-serif"><a href="eintragen.php?file=<?php echo $_FILES["datei"]["name"]; ?>">[CSV-Datei jetzt in die Datenbank schreiben]</a></font></p>
</center>
</body>
</html>

Dadurch wir der Dateiname an den Link angehängt, und du kanns in der eintragen.php per $_GET["file"] auf den Dateinamen zugreifen:

eintragen.php:
PHP:
include "config_sense.php";

mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], $db_Password[$select_db]) || die("Keine Verbindung zur Datenbank möglich: ".mysql_error());
mysql_select_db($db_Database[$select_db]);

//muss das hier überhaupt sein? die datenbank liest doch die datei und nicht das php script oder?
$fp = fopen ("csv/tx_cal.csv","r");

$sql2 = 'LOAD DATA LOCAL INFILE \'csv/'.$_GET["file"].'\' 
         REPLACE INTO TABLE `tx_cal_event` 
         FIELDS TERMINATED BY \';\' 
         ENCLOSED BY \'"\' 
         ESCAPED BY \'\\\\\' 
         LINES TERMINATED BY \'\\r\\n\'';
           
$result = mysql_query($sql2);

echo  mysql_error();
echo "<br><br><center>Einräge wurden hinzugefügt bzw. ersetzt: ".$result."</center>";

//$dateiname="csv/tx_cal.csv";
unlink($_GET["file"]);

echo "<br><br><center>".$_GET["file"]." wurde gelöscht</center>";

Hoffe das passt so ungefähr
 
Nee ist von Uwe Hess und Günther Karl, 750 Seiten spannung pur :)

gut, ich bin dir sehr dankbar, weil du mir bei dieser Geburt geholfen hast.

es gibt jetzt nur noch ein kleines Problem.

PHP:
<?php

include "config_sense.php"; 

mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], $db_Password[$select_db]) || die("Keine Verbindung zur Datenbank möglich: ".mysql_error()); 
mysql_select_db($db_Database[$select_db]); 

//muss das hier überhaupt sein? die datenbank liest doch die datei und nicht das php script oder? 
$fp = fopen ("csv/tx_cal.csv","r"); 

$sql2 = 'LOAD DATA LOCAL INFILE \'csv/'.$_GET["file"].'\'  
         REPLACE INTO TABLE `tx_cal_event`  
         FIELDS TERMINATED BY \';\'  
         ENCLOSED BY \'"\'  
         ESCAPED BY \'\\\\\'  
         LINES TERMINATED BY \'\\r\\n\''; 
            
$result = mysql_query($sql2); 

echo  mysql_error(); 
echo "<br><br><center>Einräge wurden hinzugefügt bzw. ersetzt: ".$result."</center>"; 

//$dateiname="csv/tx_cal.csv"; 
unlink($_GET["file"]); 

echo "<br><br><center>".$_GET["file"]." wurde gelöscht</center>"; 
?>

Es löscht nicht die Datei, folgender fehler:

Einräge wurden hinzugefügt bzw. ersetzt: 1

Warning: unlink(tx_cal.csv) [function.unlink]: No such file or directory in /mnt/web1/11/20/51641420/htdocs/uniq/kontur21/ver/eintragen.php on line 24
tx_cal.csv wurde gelöscht


aber ich denke dort muss ich noch das Verzeichniss mit angeben?

dann hast du mich gefragt:
//muss das hier überhaupt sein? die datenbank liest doch die datei und nicht das php script oder?
$fp = fopen ("csv/tx_cal.csv","r");

mhh das weiß ich nicht ich schicke die csv über dieses Formular:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<center>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Arial, Helvetica, sans-serif" size="6">CSV-Datei "tx_cal.csv" w&auml;hlen und best&auml;tigen. </font></p>
<form method="post" action="upload.php" enctype="multipart/form-data">
  <p>&nbsp;</p>
  <p>Datei:
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
      <input type="file" name="datei" size="40" maxlength="100000">
      <input type="submit" name="Submit" value="Senden">
    </p>
</form></center>
<?php

// Dateiinformationen (Ausgabe über Schleife)
if (isset($_FILES["datei"])) {
  foreach ($_FILES["datei"] as $key=>$element) {
    echo "[$key] => $element<br>";
  }
}
?>
</body>
</html>

muss ich dann die datei nicht trozdem fopen?


:rolleyes:
 
Genau, um den Fehler bei der unlink Funktion wegzubekommen musst du noch das Verzeichnis mit angeben:
PHP:
unlink("csv/".$_GET["file"]);
Und ich denke nicht, dass du die Datei vorher fopen musst. Hab aber noch nie mit dem LOAD DATA INFILE gearbeitet. Kannst es ja einfach durch auskommentieren ausprobieren...

Noch was: Den php-Teil unter dem Formular kannst du dir ja wahrscheinlich sparen. Da wird nie eine Ausgabe kommen, oder? Denn $_FILES ist ja nur gesetzt, wenn das Formular abgeschickt wurde, und wenn es abgeschickt wird, geht es ja direkt zu einer andern (upload.php) Datei.

Viel Spass noch mit dem Buch ;) Gute Nacht
 
Zurück