PHP Dateidownload erzwingen

Dennis321

Newbie
Registriert
Sep. 2011
Beiträge
4
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:

______________________________
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:
______________________________
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:
Code:
			$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
 
Zuletzt bearbeitet:
Hallo,
Nach basename() steht doch in $dateiname wirklich nur noch der Dateiname und du hast die Datei doch nicht im Root-Verzeichnis gespeichert oder? Wenn doch dann würde ich auf jeden Fall mal einen dafür anlegen. Außerdem rufst du bei filesize den Pfad Datei auf? Das widerspricht sich ja.
Ansonsten kann es offenbar sein, dass der IE mit force-download nicht richtig zurecht kommt nimm doch einfach mime_content_type() und gib den Typ an.
 
Danke euch beiden,
chmod hatte ich gesetzt, ist mit den arbeiten scheinbar iwo verloren gegangen (peinlich :D)
Bin heut iwie etwas verpeilt...
ok, nun kann man die Datei als Link runterladen,
nur z.B. .pdf werden im Browser geöffnet und nicht runtergeladen...

Ich habe das nun auch als Button versucht,
also button mit den namen der Datei als name='$dname'.

Mit:
if(isset($_POST[$dname]))
dann benutzt,
sieht zurzeit so aus:

PHP:
if(isset($_POST[$datei]))
{
$groesse = filesize($datei);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename='".$datei."'");
header("Content-Transfer-Encoding: binary");
header('Content-Length: '.$groesse);
}

Nur leider funktioniert der Button nicht, wenn man ihn klickt, passiert nichts.
Die Variable $datei wird richtig übergeben, iwo in den header müsste glaube ich der Fehler sein.
Dank euch^^
Dennis
 
Zuletzt bearbeitet:
Ich denk mal es ist ein htaccess Problem.

Windows mit Xampp? Normalerweise sollte die VirtualHost Datei sich hier: C:\xampp\apache\conf\extra\httpd-vhosts.conf befinden. Was steht dort in den Zeilen die jeweils mit "AllowOverride" anfangen?
 
Nein
Ich benutze einen Webspace zum testen^^
und da finde ich keine htaccess bzw. habe vll. auch keinen zugriff darauf
 
mach mal folgendes in deinem skript wo der link zum klicken auf die datei ist

PHP:
$dateiname = "datei.txt";
if(file_exists($dateiname))
   echo "Datei ".$dateiname." existiert";
else
   echo "Datei ".$dateiname." existiert nicht";

Also nich da wo du den Download beginnen willst, sondern da wo der Link zum draufklicken erscheint. ggf $dateiname anpassen. Vllt ist die Datei auch einfach im flaschen Ordner?
 
Der Ordner ist data, vergessen zu erwähnen, sry...
also data/datei.txt.

Die Links gehen nun, nur leider wie gesagt öffnet sich z.B. txt oder pdf im Browser, statt sie runter zu laden.
Hier das mal ausführlicher:
PHP:
$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
 
Bspw. so:
PHP:
function DownloadFile( $Filename, $Speed = 0, $Unit = 'kib' )
{
  if( !file_exists( $Filename ) ) return false;

  $readbytes = 0;
  switch( strtolower( $Unit ) )
  {
    case 'b'   : $readbytes = $Speed; break;
    case 'kb'  : $readbytes = $Speed * 1000; break;
    case 'kib' : $readbytes = $Speed * 1024; break;
    case 'mb'  : $readbytes = $Speed * 1000000; break;
    case 'mib' : $readbytes = $Speed * 1048576; break;
  }

  $filesize = filesize( $Filename );
  header( 'Content-Type: application/octet-stream' );
  header( 'Content-Disposition: attachment; filename="'.basename( $Filename ).'"' );
  header( 'Content-Length: '.$filesize );
  header( 'Cache-Control: private' );

  set_time_limit( 0 );

  $read = 0;
  if( $Speed > 0 )
  {
    $fh = fopen( $Filename, 'r' );

    if( $fh )
    {
      while( !feof( $fh ) )
      {
        echo fread( $fh, $readbytes );
        $read += $readbytes;
        flush();

        sleep( 1 );
      }

      fclose( $fh );

      return $read >= $readbytes;
    }
  }
  else
  {
    readfile( $Filename );
    return true;
  }

  return false;
}
Hab damit aber nur kleine Dateien probiert (< 20 MB).
 
Zuletzt bearbeitet:
Die Dateien sollten mit der Variante von Yuuri nicht größer als 100MB sein, sonst funktioniert es nicht mehr.
 
Zurück
Oben