You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Wednesday, September 28th 2011, 5:05pm

Datei als Download

Hallo,
Ich habe etwas geschrieben, womit man Dateien auf der Website hochladen kann, Die werden für den User dann angezeigt und man kann sie einzeln löschen und so.
Soweit funktioniert dies, nur die Datei kann man nicht runterladen.
Wenn ich einen Link mit dem Dateiname generieren lasse und man dann draufklickt (z.B. http://www.HOMEPAGE.de/datei.txt) kann man sie nicht runterladen,
sie wird auch nicht im Browser angezeigt, sondern kommt dann:

Source code

1
2
3
4
Forbidden

You don't have permission to access /dateien/datei.txt on this server.
Apache/2.2.3 (Debian) mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.HOMEPAGE.de Port 80


Manchmal kommt dann der Fehler mit dem Text:

Source code

1
2
3
4
Not Found

The requested URL /dateien/datei.txt was not found on this server.
Apache/2.2.3 (Debian) mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.HOMEPAGE.de Port 80

Und dann auch "Die Webseite kann nicht gefunden werden".


Daraufhin habe ichs mal mit "header" versucht, und zwar so:

PHP Quellcode

1
2
3
4
5
6
$dateiname = basename($datei);
			$groesse = filesize($datei);
			header("Content-Type: application/force-download");
			header("Content-Disposition: attachment; filename=".$dateiname);
			header("Content-Length:".$groesse);
			readfile($dateiname);


die Variable $dateiname beinhaltet den Name der Datei (im Beispiel nun datei.txt).
Dieser Wert wird via POST auch korreckt übergeben.


Warum die Datei nicht runterladbar ist, weiß ich leider nicht,
kann es vll. am Webspace liegen?
Danke euch für eure Hilfe^^

PS: Datei ist auf dem Server im richtigen Ordner

This post has been edited 3 times, last edit by "TheDD" (Sep 28th 2011, 5:38pm)


2

Friday, September 30th 2011, 9:01pm

Ich verstehe dein Header Beispiel nicht, du versuchst doch direkt auf die Datei zuzugreifen, also ohne irgendwelche Header?
Interessant wären die Permissions der Datei. Welchen CHMOD hat die Datei? Eigentümer der angelegten Datei ist vermutlich der Webserver?

3

Friday, September 30th 2011, 11:58pm

Also das sieht mitlerweile etwas anders schon aus:

Mit chmod ("data/".$dateiname, 0644); gebe ich den Dateien die Rechte 644.

Der Ordner ist data, vergessen zu erwähnen, sry...
also data/datei.txt. (beispiel)

Die Links gehen nun, nur leider öffnet sich z.B. txt oder pdf im Browser, statt sie runter zu laden.
Hier das mal ausführlicher:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$dateien = mysql_query("SELECT * FROM Daten ORDER BY ID DESC"); // DB
 
while($row = mysql_fetch_assoc($dateien)) 
{
$idkill = $row[ID];
$dateinameabb = $row[dateiname]; // Enthält aus SQL den Dateiname (datei.txt)
 
echo "<a href='http://www.HOMEPAGE.de/data/$row[dateiname]'>$row[dateiname] herrunterladen</a><br />
<form action='dataupload.php' method='post'><input type='submit' name='$dateinameabb' value='Download' /><br />
<form action='dataupload.php' method='post'><input type='submit' name='$idkill' value='L&ouml;schen' />";
 
 
 
	if(isset($_POST[$idkill]))
	{
		mysql_query("DELETE FROM Daten WHERE ID = $idkill");
		unlink("data/".$row[dateiname]);
		echo "<br /><br />Datei gel&ouml;scht!<br /><br />";
	}
	elseif(isset($_POST[$dateinameabb]))
	{			
			$groesse = filesize("data/".$dateinameabb);
			header("Content-Type: application/force-download");
			header("Content-Disposition: attachment; filename='data/$dateinameabb'");
			header("Content-Transfer-Encoding: binary");
			header('Content-Length: '.$groesse);
 
	}
 
}


So siehts ungefähr aus (Ich habs noch mit Tabelle und ein aar Daten mehr und so, aber wäre nun zuviel, alles zu posten, im Grunde ist das das ja^^)
Klickt man nur den Link an, öffnet man die Date.
Klickt man auf dem Button löschen, löscht er die Datei auch richtig aus der DB und aus dem Ordner.
klick ich nun auf Download, passiert nichts...
Zu jeder Datei gibt es ein SQL Eintrag, das funktioniert auch soweit, wie das hochladen der Datei und das chmod setzen und in die DB setzen und so.

Nur noch der Downloadbutton muss gehen :D
Und beim Link öffnet er es automatisch z.B. .pdf oder .txt im Browser.

4

Saturday, October 1st 2011, 1:49pm

Im Dateinamen kannst du keinen Pfad unterkriegen. Vermutlich ist der Content-Disposition Header deswegen ungültig. Versuche mal data/ zu entfernen.
Ansonsten wird der Case wirklich ausgeführt? Der Download wird per POST angestoßen?

5

Saturday, October 1st 2011, 3:55pm

okay, also habe ich nun header("Content-Disposition: attachment; filename='$dateinameabb'"); gemacht.
Funktionieren tut es leider immer noch nicht.

Ich habe auch mal via echo versucht, unter den header was anzeigen zu lassen, ob der Dateiname übergeben wird nud zwar so:
<br /><br />Datei: $dateinameabb<br /><br />";

Leider wird dies beim klick auf dem Button uch nicht angezeigt.
Warum weiß ich auch nicht, da das mit dem löschen problemlos funktioniert...

6

Sunday, October 2nd 2011, 11:28am

Ach mir fällt auf.. du versuchst echos mit Downloads zu mischen. Das geht natürlich nicht.
Wenn dein Dateidownload angestoßen wird, dürfen keine anderen Ausgaben vorhanden sein. Und nach dem readfile beendet du am besten mit exit.

Weiterer Fehler: Du verwendest einfach Anführungszeichen beim Dateinamen. Es müssen laut HTTP Protokoll aber doppelte sein.

Similar threads

Social bookmarks