staging.inyokaproject.org

[PHP]: MIME unter div. Betriebssysteme anders?

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

berndix2

Avatar von berndix2

Anmeldungsdatum:
22. November 2004

Beiträge: 734

Hallo Forum,

habe da ein etwas dümmliches Problem. Ich habe ein upload in PHP realisert, indem ich möchte, dass nur zip-Files hochgeladen werden können. Hier mal die Funktion...

/*
	uploadFile(string) kopiert die hochgeladene Datei in $temp_dir. Dabei muss
	das Name-Attribut des input-HTML-Tags mitgegeben werden. Dabei  werden 
	folgende Werte zurueck gegeben:
	0	Erfolg
	1	Die Datei ist kein Zip-Archiv
	2	Fehler bim Upload
	3	Fehlendes Attribut des korrelierenden input-tags
   4  Die Datei konnte nicht ins Zielverzeichnis verschoben werden
*/

function uploadFile($param_file) {
	global $temp_dir;
	if (!empty($param_file)) {
      if ($_FILES[$param_file]["error"] == 0) {
         if ($_FILES[$param_file]["type"] != "application/zip") {
				//echo "type = ".$_FILES[$param_file]["type"]."<br>\n";
				return 1;
            exit;
			}
         else {
				$from = $_FILES[$param_file]["tmp_name"];
				$to = $temp_dir."/".$_FILES[$param_file]["name"];
				echo "Copy $from to $to<br>\n";
            if (move_uploaded_file($from,$to)) return 0;
            else {
               return 4;
               exit;
            }
			}
      }
      else {
			// Ausgabe: Fehler beim Upload
			// echo "<pre>"; var_dump($_FILES); echo "</pre>";
			return 2;
         exit;
		}
	}
   else return 3;
}


Wenn ich jetzt unter Ubuntu ein Zip-File da durch jage, bekomme ich return 0 (→ application/zip), sprich alles ok, unter Windows bekomme ich unterschiedlichste Resultate je nach Browser. Zwar wird immer return 1 zurück gegeben aber $_FILES[$param_file]["type"] ist unterschiedlich!
IE6: application/x-zip-compressed
FF: application/octet-stream

Hä? 😲 Das Formular enthät enctype="multipart/form-data". Was ist hier los ❓ ❓ ❓

Grüße
Bernd

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Du kannst Dich nicht auf die MIME-Typ Angabe verlassen um ein ZIP zu erkennen weil die nicht eindeutig sind.

berndix2

(Themenstarter)
Avatar von berndix2

Anmeldungsdatum:
22. November 2004

Beiträge: 734

Ok, habe hier nen kleinen Workaround mit extract...
Auf den ersten Blick funktioniert es:

function uploadFile($param_file) {
	global $temp_dir;
	if (!empty($param_file)) {
      if ($_FILES[$param_file]["error"] == 0) {
			$command = "extract ".$_FILES[$param_file]["tmp_name"];
			$mime = exec ($command, $stdout, $status);
         if ($mime != "mimetype - application/zip") {
				//echo "type = ".$_FILES[$param_file]["type"]."<br>\n";
				return 1;
            exit;
			}
         else {
				$from = $_FILES[$param_file]["tmp_name"];
				$to = $temp_dir."/".$_FILES[$param_file]["name"];
				echo "Copy $from to $to<br>\n";
            if (move_uploaded_file($from,$to)) return 0;
            else {
               return 4;
               exit;
            }
			}
      }
      else {
			// Ausgabe: Fehler beim Upload
			// echo "<pre>"; var_dump($_FILES); echo "</pre>";
			return 2;
         exit;
		}
	}
   else return 3;
} 

BTW: extract rockt. 8)
Gruß

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Reicht dir die PHP-Funktion mime_content_type() nicht aus? So würdest du dir die Ausführung von Shellbefehlen sparen.

Gruß
Christian

berndix2

(Themenstarter)
Avatar von berndix2

Anmeldungsdatum:
22. November 2004

Beiträge: 734

😲 Huch... Hab ich die Funktion übersehen...
Gleich mal ausprobieren...

Hmm... Gibt mir bei nem ZIP text/plain zurück??? :evil: 🤣 Ach das ist halt PHP. Nichts funktioniert, ehe man nicht an zig bescheuerten Dateien rumgeschraubt hat. Ne, ich bleib bei extract, denn ein Shellbefehl irrt nie. 😀 Ich bin sowieso auf ne ganze Menge Shellbefehle angewiesen, da ich ne WEB-Applikation programmiere, die eh _nur_ firmenintern läuft.
Grüße und Danke
Bernd

Antworten |