Beiträge

[PHP] Dateiupload und Dateidownload

Jeder macht das eine und einige machen auch das andere. Die Rede ist vom Hoch- und Runterladen von Dateien im Internet. Jeder kann etwas herunter laden. Ob die Bedienungsanleitung, im PDF-Format, für den Fernseher oder ein schickes Bildchen als Bildschirmhintergrund oder oder oder… die Möglichkeiten sind schier unbegrenzt. Auf der anderen Seite gibt es natürlich auch I-Net Nutzer die auch Dinge hochladen.

Hier möchte ich kurz erklären wie man es als PHP Programmierer lösen kann. Viele Wege führen bekanntlich nach Rom. Hier mein Weg.
Als erstes der Upload. Hier brauchen wir natürlich überhaupt erst einmal eine HTML-Form mit einem Dateifeld. In seiner einfachsten Form würde das so aussehen:



Hier kann der User dann seine Datei auswählen und die Form abschicken. Damit wird, in diesem Fall, die Datei erneut aufgerufen und die Formulardaten mit übergeben. Sprich die Dateidaten. Diese können nun mit PHP erfasst und ausgewertet werden.


if(!empty($_FILES["file"]["name"])) {
	$UploadFolder = "./uploads/";

	//Dateinamen auf ungueltige Zeichen pruefen
	$Dateiname = preg_replace('/[^a-z0-9.-_]/', '', strtolower($_FILES["file"]["name"]));

	//Existiert die Datei auch noch nicht
	if(!file_exists($UploadFolder.$Dateiname)) {
		//An die richtige Stelle kopieren
		move_uploaded_file($_FILES['file']['tmp_name'], $UploadFolder.$Dateiname);
		if(!file_exists($UploadFolder.$Dateiname)) {
			echo "Datei konnte nicht hochgeladen werden. Bitte wenden Sie sich an einen Administrator.";
		} else {
			//Datei ist hochgeladen
		}
	} else {
		echo "Es existiert bereits eine Datei mit diesem Dateinamen. Bitte bennenen Sie die Datei um.";
	}
}

So. Damit haben wir die Datei hochgeladen und in dem Ordner „Uploads“ abgelegt. Das ist natürlich nicht alles. Jeder muss hier seinen eigenen Weg gehen.
Der Dateiname muss z.B. irgendwo (Datenbank) gespeichert werden, damit sich das System später daran „erinnert“. Aber für den Upload selbst reicht das.

Kommen wir zum 2. Teil. Dem Download der Datei.

Ein User hat jetzt eine Bedienungsanleitung auf einer Webseite hochgeladen und für andere Benutzer zum Download zur Verfügung gestellt. Jetzt kommt ein anderer User und möchte die Datei downloaden.

Als Programmierer wäre es das einfachste einfach einen Link zu veröffentlichen der auf die Datei, im Dateisystem, zeigt. Das hätte aber den Nachteil das dieser Link kopiert werden könnte und jeder die Datei einfach herunterladen kann. Schlecht wenn das vielleicht eigentlich nur registrierte Mitglieder dürfen sollen.
Also muss eine andere Lösung her. Hier wieder mein Weg nach Rom ;-)


$UploadFolder = "./uploads/"; //Name des Ordners mit der Downloaddatei
$FileName = "musterdatei.pdf"; //Name der Downloaddatei

header("Content-Type: ".$mimeType);
header("Content-Length: ".filesize($UploadFolder.$FileName));
header("Content-Disposition: attachment; filename="".$FileName.""");
readfile($UploadFolder.$FileName);
exit;

Ja, das war es schon ;-) Aber es ist etwas komplizierter als es auf den ersten Blick scheint. Ich denke die ersten beiden Variablen sind klar. Der Content-Type beschreibt die Datei. Ob es ein Bild, PDF, Word-Dokument oder sonst was ist. Am besten ist hier diesen beim Upload gleich mit zu speichern. Denn das ist der einzige Zeitpunkt wo Du den Content Type „geliefert“ bekommst. Sonst könnte man ihn noch über die Dateierweiterung rausbekommen.

Content-Length ist die Länge der Datei. Vorsicht, nicht wirklich die Größe. Da 1 Zeichen aber einem Byte entspricht – wie praktisch – können wir einfach die Dateigröße in Byte (!) angeben. ;-)

Bei Content-Disposition wird einfach gesagt Dateianhang und den Dateinamen. Hier muss nicht der Originale Dateiname angegeben werden, es könnte auch ein fiktiver angegeben werden.

Und zu guter letzt noch mit readfile die Datei einlesen und gleichzeitig ausgeben.

Ganz wichtig ist hier noch das vor diesem Code keine Ausgabe an den Browser gemacht werden darf. Am besten ist es für den Download eine eigene Datei zu erstellen und vor diesem Code nur das nötigste zu tun. Zum Beispiel checken ob der User, der den Download starten möchte, auch die Berechtigung hat oder die Variablen aus einer Datenbank auslesen. Aber keinerlei ausgaben an den Browser machen, sonst erscheinen ganz viele komische Zeichen im Browser ;-)

FavIcon erstellen – Schnell, kostenlos und Online

Kurzes Update vorweg: FavIcon-Script jetzt zu kaufen -> Favicon Generator. Betreiben Sie einen eigenen FavIcon-Service auf Ihrer Homepage und lassen Sie ihre Kunden ihr eigenes Favicon erstellen.

Hallo zusammen,

es gibt mal wieder was neues in meiner Softwaresammlung.

Jeder kennt diese kleinen Icons neben der Internetadresse im Browser (siehe oben im Browser). „FavIcon“ ist der Name des kleinen Icons das dazu beiträgt das eine Internetseite etwas mehr individuell wird. Aber der eigentliche Zweck ist die Favoritenliste… daher auch der Name „Favoriten Icon„… kurz „Favicon“. Jeder der mit der Favoritenliste arbeite weiß, wenn man einmal 100 Favoriten gespeichert hat dann kann man schon mal eine weile suchen bis man den gesuchten Link gefunden hat. So kam wohl mal jemand auf die Idee ein kleines Icon zu basteln und dieses in der Liste mit zu speichern, damit hat man eine visuelle Orientierungshilfe und findet den gewünschten Link schneller.

Das Problem was ich mit den Icons immer habe ist das es sich um ein spezielles Dateiformat handelt. Nämlich das „*.ico“-Format. Das dumme dabei ist das nur spezielle Programme dieses Format erstellen können und auch damit umgehen können. Nicht einmal Profisoftware wir Photoshop kann ein simples Favicon erstellen. Vielleicht zu simpel für Adobe??

Auf der anderen Seite gibt es aber sogar Webseiten die anbieten kostenlos, per Skript, ein Favicon aus einer Bilddatei zu erstellen. Also kann es nicht sooo schwierig sein, wenn selbst ein PHP-Skript diese Icons erstellen kann. Und die Fähigkeiten von PHP-Skripten sind doch begrenzter als Offline-Software.

Nun habe ich mir letztens bei eBay selbst ein Favicon-Script gekauft. Der Preis war gut und ich benötige es ja selbst des öfteren um Icons für meine oder Kunden-Webseiten zu erstellen.

Natürlich ist es nicht nur für mich gedacht, jeder soll und kann es nutzen wenn er es braucht. Einfach eine eigene Bilddatei hochladen, optional einen Text eingeben und abschicken. Das Skript erstellt das Favicon (in verschiedenen Varianten) und es sofort runtergeladen werden. Das wars, keine Anmeldung nötig, absolut kostenlos, nur 2 Eingabefelder. Simpel und einfach. ;)

Finden könnt ihr den Favicon-Generator hier: Bitte klicken zum Favicon erstellen

Jetzt funktioniert er endlich. Habe geschlagene 2 Tage dran gewerkelt bis das Skript endlich funktioniert hat.
Wie gesagt, bei eBay ersteigert das gute Stück. Ich hatte ja schon 2-3 mal Skripte bei eBay ersteigert und mich hinterher geärgert. Die Programmierung war jedes mal grotten schlecht und im Endeffekt hätte man es selbst fast schneller hinbekommen. :(

Doch diesmal hatte ich die Hoffnung das es besser werden würde. Leider vergebens. Nachdem ich das Skript vom Verkäufer runtergeladen hatte und entpackt hatte wurde mir schnell klar „Ach du sch****“. Tabellen-Layout, PHP und HTML gemixt, CSS nicht ausgelagert… kurz, eine Katastrophe.

Somit bin ich schnell bei meinem Lieblings-Layouthersteller vorbei und habe mir erst einmal ein schönes CSS-Layout ausgesucht. Das dann Eingebaut und angepasst, dabei auch gleich PHP vom Layout getrennt. Nun war das Layout schick. Bei den Umbauarbeiten ist mir auch gleich aufgefallen das der Text sehr komisch zu lesen ist… ein Blick und es wurde klar: Der Text ist nicht original deutsch. Sprich eigentlich war das Skript mal in einer anderen Sprache und wurde a la Onlineübersetzer ins Deutsche übersetzt. Wer das schon mal gemacht hat weiß was ich meine.
Also auch noch die Texte neu schreiben. Waren ja zum Glück nicht so viel.

Dann war alles schick und funktionierte. Also Subdomain eingerichtet und hochgeladen. Jetzt funktionierte es aber auf einmal nicht mehr. … ????
Das Skript war nur mit Windows-Systemen kompatibel und die ZIP-Funktion funktionierte auf Linuxsystemen nicht. Super. Das war dann der 2. Tag. Den verbrachte ich dann damit die Funktionsfähigkeit auf meinem Webserver herzustellen.

Im Endeffekt habe ich das Skript nun fast komplett neu geschrieben. Aber nun funktioniert es und alles ist super. :) Ich hoffe es kommt auch ein bisschen an und die Leute nutzen es fleißig. Ich werde es des öfteren auf jeden Fall tun. :)

Was ich allerdings überlege ist den Verkäufer aus dem Copyright rauszunehmen. Denn wie gesagt, mittlerweile ist es mehr von mir erstellt als von Ihm. Wobei ich mir auch nicht sicher bin das er überhaupt der Hersteller des Skripts ist. Aber vielleicht hat er es selbst mal komplett gekauft und verkauft es jetzt nur als Lizenz weiter.
Ich werde mich da mal belesen wie sich das verhält und ihn, wenn es geht, aus dem Copyright rauskicken. Wer so eine schlampige Arbeit verkauft… naja.

Update: Ich HABE das Skript jetzt neugeschrieben. Das hat mich ja irgendwie total angebrochen. So etwas noch mit einem Link zu belohnen. Zumal der Großteil eh schon umgeschrieben werden musste und wahr. Und das Skript ist nun komplett neu geschrieben und anders was anders gemacht werden konnte. Somit hat sich das Thema erledigt und alles ist nun schick :)